Группировать многомерный массив по определенному значению?

Надеюсь, я могу это объяснить правильно …

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

Итак, я пытаюсь сгруппировать их по уровню, но я не буду знать уровень заранее. Итак, я не могу поместить его в цикл for и сказать, пока $ 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 ) ) ) 

Сначала вам необходимо сгруппировать их по уровню

Используйте 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); Проточите  $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); Проточите  $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); Проточите  $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); Проточите  $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); 

Результат печати ($ 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 ) ) 

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

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

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

Оставляет вам форму, которую вы хотели, и все ссылалось вместе.

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

 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'); 

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

 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; 
  $result = array(); foreach ($yourArrayList as $data) { $id = $data['level']; if (isset($result[$id])) { $result[$id][] = $data; } else { $result[$id] = array($data); } } 
 function _group_by($array,$key,$keyName) { $return = array(); foreach($array as $val) { $return[$keyName.$val[$key]][] = $val; } return $return; } //end of function