如何按特定子阵列值对多维数组进行分组?

时间:2010-02-03 04:09:34

标签: php arrays multidimensional-array grouping

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

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

Array (
   [0] => Array (
          [cust] => XT8900
          [type] => standard
          [level] => 1
          )
   [1] => Array (
          [cust] => XT8944
          [type] => standard
          [level] => 1
          )
   [2] => Array (
          [cust] => XT8922
          [type] => premier
          [level] => 3
          )
   [3] => Array (
          [cust] => XT8816
          [type] => permier
          [level] => 3
          )
   [4] => Array (
          [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
                 )
          )
)

7 个答案:

答案 0 :(得分:38)

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

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

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

为您留下您想要的表格以及一起引用的所有内容。

尽可能在第一时间构建这样的数组。

答案 1 :(得分:10)

您需要先按级别对其进行分组

使用 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
             )
      )

答案 2 :(得分: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');

答案 3 :(得分:5)

以下是针对相同问题的解决方案,包装为函数:

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

要通过名为“level”的键对$ myarray进行排序,请执行以下操作:

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分: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); 

答案 6 :(得分:-1)

function _group_by($array,$key,$keyName)
    {
          $return = array();

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

    }  //end of function
相关问题