Я искал решения для этого без реального успеха. У меня есть многомерный массив родителей и детей без ограничений по глубине. Это создается из базы данных, но проблема в том, что идентификатор элемента становится ключом, используя мой способ размещения плоского массива в многомерном массиве, например:
Array( [28] => Array ( [id] => 28 [color] => #ff24e5 [name] => Personal [parent_id] => [children] => Array ( [23] => Array ( [id] => 23 [color] => #41c3a3 [name] => Shopping [parent_id] => 28 [children] => Array ( [22] => Array ( [id] => 22 [color] => #8be32b [name] => Deals [parent_id] => 23 [children] => Array ( ) ) ) ) [150] => Array ( [id] => 150 [color] => #e9a3f0 [name] => Orders [parent_id] => 28 [children] => Array ( ) ) ) ) )
Что бы я хотел, это функция, которая выполняет следующие действия:
Array ( [0] => Array ( [id] => 28 [color] => #ff24e5 [name] => Personal [parent_id] => [children] => Array ( [0] => Array ( [id] => 23 [color] => #41c3a3 [name] => Shopping [parent_id] => 28 [children] => Array ( [0] => Array ( [id] => 22 [color] => #8be32b [name] => Deals [user_id] => 1 [selected] => 0 [parent_id] => 23 [children] => Array ( ) ) ) ) [1] => Array ( [id] => 150 [color] => #e9a3f0 [name] => Orders [parent_id] => 28 [children] => Array ( ) ) ) ) )
По существу, переназначайте ключи, начиная с 0. Я пробовал множество методов, но я предполагаю, что мне нужно найти рекурсивное решение, и когда я попробовал это, он уничтожил мой массив. Я читал функцию array_walk_recursive (), но я не совсем понимаю, что делать дальше. По сути, есть ли способ сбросить числовые ключи в многомерном массиве?
Спасибо за помощь!
function fix_keys($array) { foreach ($array as $k => $val) { if (is_array($val)) $array[$k] = fix_keys($val); //recurse } return array_values($array); }
Я пытался решить ту же проблему, вот код
$array = array_values($array);
Вам действительно нужно добавить условие is_numeric, чтобы остановить смешивание текстовых клавиш …
function fix_keys($array) { foreach ($array as $k => $val) { if (is_array($val)) $array[$k] = $fix_keys($val); //recurse } if( is_numeric($k) ) return array_values($array); return $array; }
Я сделал это вместо этого:
function fix_keys($array) { $numberCheck = false; foreach ($array as $k => $val) { if (is_array($val)) $array[$k] = fix_keys($val); //recurse if (is_numeric($k)) $numberCheck = true; } if ($numberCheck === true) { return array_values($array); } else { return $array; } }