Сброс ключей массива в многомерном массиве
Я искал решение для этого без реального успеха. У меня есть многомерный массив родителей и детей без ограничений по глубине. Это генерируется из базы данных, но проблема в том, что идентификатор элемента становится ключом, используя мой способ организации плоского массива в многомерный массив, например:
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 (), но я не совсем знаю, что делать дальше. По сути, есть ли способ сбросить числовые ключи в многомерном массиве?
Спасибо за помощь!
4 ответов
function fix_keys($array) {
foreach ($array as $k => $val) {
if (is_array($val))
$array[$k] = fix_keys($val); //recurse
}
return 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;
}
}
правильный ответ сбросить все клавиши и не игнорировать не числовые клавиши, "Лобос" ответ шаг в правильном направлении, но сбросить тоже не числовые клавиши на уровне 2 и ниже. для меня эта работа выполнена идеально
function array_values_recursive($array) {
$temp = array();
foreach ($array as $key => $value) {
if (is_numeric($key)) {
$temp[] = is_array($value) ? array_values_recursive($value) : $value;
} else {
$temp[$key] = is_array($value) ? array_values_recursive($value) : $value;
}
}
return $temp;
}