Intereting Posts
Помощь PHP с сбросом пароля и истечением срока действия токена Где можно найти руководства по PHP для предыдущих версий? PHP-журнал не будет игнорировать повторяющиеся ошибки с ignore_repeated_errors = On Как я могу запретить пользователям доступ к файлам include? Ошибка синтаксического анализа строки PHP с необходимой точкой с запятой после переменной Проблема с простой PHP-памятью PHP Что означает «<? =» В PHP? Codeigniter – я ищу для использования / подключения к другой базе данных для одного из моих контроллеров и одной модели Создание выпадающего списка из многомерного массива MySQL: не вставляйте новую строку, если определенные строки одинаковы Данные PHP EXIF ​​не работают удалить контроллер и имя функции из url-кода Конвертировать даты в часы AJAX терпит неудачу, в то время как данные получаются из цикла while () в php PHP получает окончательный URL-адрес перенаправления

Рекурсивно объединить подобные индексы

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

Исходный массив

$seperateArray = json_decode('[ { "tier1": "Group1", "tier2": "Blue", "tier3": "Round", "tier4": "Harold" }, { "tier1": "Group1", "tier2": "Blue", "tier3": "Round", "tier4": "Arthur" }, { "tier1": "Group1", "tier2": "Blue", "tier3": "Round", "tier4": "Tom" }, { "tier1": "Group2", "tier2": "Blue", "tier3": "Round", "tier4": "Beth" }, { "tier1": "Group3", "tier2": "Blue", "tier3": "Round", "tier4": "Peter" }]', true); 

Включите его:

 { "Group1": { "Blue": { "Round": [ "Harold", "Arthur", "Tom" ] } }, "Group2": { "Blue": { "Round": [ "Peter" ] } } } 

Вот где я нахожусь, но я не знаю, двигаюсь ли я в правильном направлении.

 $newCombined = array(); //this each statement will show every tier 1-4 array object foreach($seperateArray as $s) { if(!array_key_exists($s['tier1'], $newCombined) $newCombined[$s['tier1']] = array(); if(!array_key_exists($newCombined[$s['tier1']][$s['tier2']], $newCombined[$s['tier1']])) $newCombined[$s['tier1']][$s['tier2']] = array(); //.. and so on } 

Solutions Collecting From Web of "Рекурсивно объединить подобные индексы"

Если только tier4 может создавать массив, то это простой вопрос цикла и назначения (если вы в порядке с уведомлениями о молчании):

 $array = json_decode('...', true); $new = []; foreach ($array as $e) @$new[$e['tier1']][$e['tier2']][$e['tier3']][] = $e['tier4']; echo json_encode($new, JSON_PRETTY_PRINT); # to print what you asked for 

Чтобы сделать задание немного менее загадочным:

 foreach ($array as $e) { list($t1, $t2, $t3, $t4) = array_values($e); @$new[$t1][$t2][$t3][] = $t4; } 

Чтобы вернуться из $new в исходный массив:

 $original = []; foreach (array_keys($new) as $t1) foreach (array_keys($new[$t1]) as $t2) foreach (array_keys($new[$t1][$t2]) as $t3) foreach ($new[$t1][$t2][$t3] as $t4) $original[] = [ 'tier1' => $t1, 'tier2' => $t2, 'tier3' => $t3, 'tier4' => $t4, ]; echo json_encode($original, JSON_PRETTY_PRINT); 

Ответ Сидилла совершенен, но когда я работал над своим решением, я тоже опубликую его:

 $input = json_decode('[ { "tier1": "Group1", "tier2": "Blue", "tier3": "Round", "tier4": "Harold" }, { "tier1": "Group1", "tier2": "Blue", "tier3": "Round", "tier4": "Arthur" }, { "tier1": "Group1", "tier2": "Blue", "tier3": "Round", "tier4": "Tom" }, { "tier1": "Group2", "tier2": "Blue", "tier3": "Round", "tier4": "Beth" }, { "tier1": "Group3", "tier2": "Blue", "tier3": "Round", "tier4": "Peter" }]', true); $output = []; foreach($input as $row) { $recursion = &$output; foreach($row as $key => $value) { if ($key != 'tier4' && !isset($recursion[$value])) { $recursion[$value] = []; } if ($key == 'tier4') { $recursion[] = $value; } else { $recursion = &$recursion[$value]; } } } var_dump($output); 

array (3) {["Group1"] => array (1) {["Blue"] => array (1) {["Round"] => array (3) {[0] => string (6) «Harold» [1] => string (6) «Arthur» [2] => string (3) «Tom»}}} ["Group2"] => array (1) {["Blue"] => array (1) {["Round"] => array (1) {[0] => string (4) "Beth"}}} ["Group3"] => array (1) {["Blue"] => array (1) {["Round"] => & array (1) {[0] => строка (5) "Peter"}}}}

Не особенно горжусь этим, но он работает.