Как сгруппировать многомерный массив по определенному значению подмассива? - PullRequest
28 голосов
/ 03 февраля 2010

У меня есть многомерный массив, и я пытаюсь сгруппировать их по значению в определенном столбце.

Я пытаюсь сгруппировать их по 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 ]

38 голосов
/ 03 февраля 2010

Лучший способ, если у вас есть контроль над созданием начального массива, просто установить такие вещи в начале, как вы добавляете записи.

Если нет, то создайте временный массив для сортировки:

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

Оставляет вам желаемую форму и все вместе.

Сначала создайте массив таким образом, хотя, если это вообще возможно.

10 голосов
/ 03 февраля 2010

Вам нужно сгруппировать их по уровню сначала

Используйте 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 голосов
/ 27 августа 2012
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');
5 голосов
/ 15 марта 2012

Вот решение, которое я нашел для идентичной проблемы, обернутый как функция:

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

Чтобы отсортировать $ myarray по ключу с именем "level", просто сделайте это:

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

Или, если вы не хотите использовать его как функцию, просто для одноразового использования, это создаст $ myNewArray из $ myArray, сгруппированных по ключу 'level'

foreach ($myArray as $key=>$val) $myNewArray[$val['level']][]=$val;
1 голос
/ 18 декабря 2018

Лучший ответ.

    $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); 
1 голос
/ 18 октября 2014
  $result = array();
    foreach ($yourArrayList as $data) {
        $id = $data['level'];
        if (isset($result[$id])) {
            $result[$id][] = $data;
        } else {
            $result[$id] = array($data);
        }
    }
0 голосов
/ 28 мая 2016
function _group_by($array,$key,$keyName)
    {
          $return = array();

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

    }  //end of function
...