使用列值对 2d 数组数据进行分组以创建 3d 数组

问题描述 投票:0回答:8

我有一个多维数组,并试图根据特定列中的值对它们进行分组。

我正在尝试按

level
对它们进行分组,但实际上我事先并不知道级别。所以,我不能把它放在
for
循环中然后说
while $i < 7
,因为我不知道
7
是关卡键的最大值,坦率地说,我不确定这是怎么回事即使我这样做,我也需要这样做。

[
    ['cust' => 'XT8900', 'type' => 'standard', 'level' => 1],
    ['cust' => 'XT8944', 'type' => 'standard', 'level' => 1],
    ['cust' => 'XT8922', 'type' => 'premier', 'level' => 3],
    ['cust' => 'XT8816', 'type' => 'permier', 'level' => 3],
    ['cust' => 'XT7434', 'type' => 'standard', 'level' => 7],
]

期望的结果:

Array (

   [1] => Array (
          [0] => Array (
                    [cust] => XT8900
                    [type] => standard
                    )
          [1] => Array (
                    [cust] => XT8944
                    [type] => standard
                    )
          )

   [3] => Array (
          [2] => Array (
                 [cust] => XT8922
                 [type] => premier
                 )

          [3] => Array (
                 [cust] => XT8816
                 [type] => permier
                 )
          )

   [7] => Array (
          [4] => Array (
                 [cust] => XT7434
                 [type] => standard
                 )
          )
)
php arrays multidimensional-array grouping
8个回答
46
投票

最好的方法,如果您可以控制构建初始数组,那么只需在添加条目时像开始时那样设置。

如果没有则建立一个临时数组进行排序:

foreach ($input_arr as $key => &$entry) {
    $level_arr[$entry['level']][$key] = $entry;
}

留下你想要的形式和所有参考的东西。

如果可能的话,首先像那样构建数组。


11
投票

您需要先按level对它们进行分组

使用 foreach 循环到数组中检查级别是否与前一项相同然后将其与该数组分组

  $templevel=0;   

  $newkey=0;

  $grouparr[$templevel]="";

  foreach ($items as $key => $val) {
   if ($templevel==$val['level']){
     $grouparr[$templevel][$newkey]=$val;
   } else {
     $grouparr[$val['level']][$newkey]=$val;
   }
     $newkey++;       
  }
print($grouparr);

print($grouparr); 的输出将显示为您希望的格式

你也可以试试

print($grouparr[7]);

会展示

 [7] => Array (
      [4] => Array (
             [cust] => XT7434
             [type] => standard
             )
      )

print($grouparr[3]);

会展示

[3] => Array (
      [2] => Array (
             [cust] => XT8922
             [type] => premier
             )

      [3] => Array (
             [cust] => XT8816
             [type] => permier
             )
      )

7
投票

这是我针对相同问题找到的解决方案,包装为一个函数:

function arraySort($input,$sortkey){
  foreach ($input as $key=>$val) $output[$val[$sortkey]][]=$val;
  return $output;
}

要按名为“级别”的键对 $myarray 进行排序,只需执行以下操作:

$myArray = arraySort($myArray,'level');

或者,如果您不想将它作为一个函数,仅供一次性使用,这将从 $myArray 按键“level”分组创建 $myNewArray

foreach ($myArray as $key=>$val) $myNewArray[$val['level']][]=$val;

7
投票
function group_assoc($array, $key) {
    $return = array();
    foreach($array as $v) {
        $return[$v[$key]][] = $v;
    }
    return $return;
}

//Group the requests by their account_id
$account_requests = group_assoc($requests, 'account_id');

1
投票

要从示例输入中生成问题所需的确切输出,请从每行中拉出/弹出最后一个值,将该值用作第一级分组键。然后使用原来的一级索引作为二级键。然后将剩余的两个元素推入组的子集中。

代码:(演示

$result = [];
foreach ($array as $key => $row) {
    $result[array_pop($row)][$key] = $row;
}
var_export($result);

对于函数式语法,使用

array_reduce()
。 (演示

var_export(
    array_reduce(
        array_keys($array),
        function($result, $key) use ($array) {
            $result[array_pop($array[$key])][$key] = $array[$key];
            return $result;
        }
    )
);

0
投票
  $result = array();
    foreach ($yourArrayList as $data) {
        $id = $data['level'];
        if (isset($result[$id])) {
            $result[$id][] = $data;
        } else {
            $result[$id] = array($data);
        }
    }

0
投票

最佳答案

    $levels = array_unique(array_column($records, 'level'));

    $data = array();

    foreach($records as $key => $value){ 

    $data[$levels[array_search($value['level'],$levels )]][] = $value ; 

    }

    print_r($data); 

-2
投票
function _group_by($array,$key,$keyName)
    {
          $return = array();

          foreach($array as $val) {
              $return[$keyName.$val[$key]][] = $val;
          }
         return $return;

    }  //end of function
© www.soinside.com 2019 - 2024. All rights reserved.