【问题标题】:Re-order multi-dimensional array so that rows with specific column value occur as every 4th row重新排序多维数组,使具有特定列值的行每 4 行出现一次
【发布时间】:2021-03-14 03:18:31
【问题描述】:

我正在尝试根据“product_type”重新排列我的数组。 结果中索引“product_type”的第 4 个位置应该是“manufacturer”。

如果“卖家”条目太少,则“制造商”条目可能存在于下一个可用位置(反之亦然)。

我目前的输入是这样的:

$arr1 = array(
    0 => ['product_type'=>'manufacturer','id'=>1], 
    1 => ['product_type'=>'manufacturer','id'=>2], 
    2 => ['product_type'=>'seller'], 
    3 => ['product_type'=>'seller'],
    4 => ['product_type'=>'seller'],
    5 => ['product_type'=>'seller'],
    6 => ['product_type'=>'seller'],
    7 => ['product_type'=>'manufacturer','id'=>3], 
);

我预期的新数组应该是这样的:

 Array(
    [0] => Array
        (
            [product_type] => seller
        )

    [1] => Array
        (
            [product_type] => seller
        )

    [2] => Array
        (
            [product_type] => seller
        )

    [3] => Array
        (
            [product_type] => manufacturer
            [id] => 1
        )

    [4] => Array
        (
            [product_type] => seller
        )

    [5] => Array
        (
            [product_type] => seller
        )

    [6] => Array
        (
            [product_type] => manufacturer
            [id] => 2
        )
    [7] => Array
        (
            [product_type] => manufacturer
            [id] => 3
        )

)

对于这个解决方案,我正在尝试这个,但是在第一名的结果中,我得到了“制造商”产品。

$arr1 = array(
    0 => ['product_type'=>'manufacturer','id'=>1], 
    1 => ['product_type'=>'manufacturer','id'=>2], 
    2 => ['product_type'=>'seller'], 
    3 => ['product_type'=>'seller'],
    4 => ['product_type'=>'seller'],
    5 => ['product_type'=>'seller'],
    6 => ['product_type'=>'seller'],
    7 => ['product_type'=>'manufacturer','id'=>3], 
) ;


function rearrange(&$arr, $n) 
{ 
     for ($i = 0; $i < $n; $i++) 
     {  
        $j = $i+1;
        if($arr[$i]['product_type'] =='manufacturer'){
            if($j%4!= 0){
                //echo $i;
                $temp = $arr[$i];
                $arr[$i] = $arr[$i + 1]; 
                $arr[$i + 1] = $temp;
            } else {
                if ($i==0 || $i==1 || $i==2) {
                  $temp = $arr[$i];
                  $arr[$i] = $arr[$i + 1]; 
                  $arr[$i + 1] = $temp;
                } else {
                  $temp = $arr[$i];
                  $arr[$i] = $temp;
                }
                
            }
        } else {
          $temp = $arr[$i];
          $arr[$i] = $temp;
        }
     } 
  
   
    return $arr;
} 
$keys    = array_keys ($arr1);
$n = count ($keys);
$arr = rearrange($arr1, $n); 
print_r($arr);

FIDDLE

【问题讨论】:

  • 源数据示例?
  • 所以基本上你有两个“数据池”,并且在获取“制造商”之前,你想从“卖家”池中提取三次的项目总数?
  • @Scuzzy 是 3 卖家 1 制造商 如果没有足够的卖家制造商将来没有数据将删除只是重新安排
  • 感谢您提出一个好问题 Lemon。可悲的是,在同一个问题中很少看到minimal reproducible example 和编码尝试......我没有很多机会对问题提出投票......老实说,令人耳目一新。

标签: php arrays sorting for-loop multidimensional-array


【解决方案1】:
  • 在您迭代时,每隔 4 个键存储制造商条目。
  • 将卖家条目存储在每个键上,而不是每 4 个键。
  • 按新分配的键排序。
  • 重新索引数组。

只要您有足够的合格数据,您的模式就会得到支持。当您拥有太多的一组数据时,它就会在最后被集中起来。

代码:(Demo)

$arr1 = array(
    0 => ['product_type'=>'manufacturer','id'=>1], 
    1 => ['product_type'=>'manufacturer','id'=>2], 
    2 => ['product_type'=>'seller'], 
    3 => ['product_type'=>'seller'],
    4 => ['product_type'=>'seller'],
    5 => ['product_type'=>'seller'],
    6 => ['product_type'=>'seller'],
    7 => ['product_type'=>'manufacturer','id'=>3], 
);

$manuCounter = 0;
$sellerCounter = 0;
$result = [];
foreach ($arr1 as $row) {
    if ($row['product_type'] === 'manufacturer') {
        $manuCounter += 4;
        $result[$manuCounter] = $row;
    } else {
        ++$sellerCounter;
        if (!($sellerCounter % 4)) {
            ++$sellerCounter;
        }
        $result[$sellerCounter] = $row;
    }
}
ksort($result);
var_export(array_values($result));

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 2016-07-23
    • 2012-08-11
    • 2022-01-12
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 2017-08-02
    • 2015-10-20
    相关资源
    最近更新 更多