Reputation: 633
I've been looking around for a solution to this with no real success. I have a multidimensional array of parents and children with no limits on depth. This is generated from a database but the issue is that the item ID becomes the key using my way of arranging a flat array into a multidimensional array like so:
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
(
)
)
)
)
)
What I would like, is a function that does the following:
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
(
)
)
)
)
)
Essentially reassign keys starting from 0. I've tried numerous methods, but I'm assuming that I need to find a recursive solution and when I tried that, it destroyed my array. I was reading up on the array_walk_recursive() function, but I don't quite know what to do beyond that. Essentially, is there a way to reset numeric keys in a multidimensional array?
Thanks for the help!
Upvotes: 11
Views: 13734
Reputation: 321
the correct answer reset all keys and dont ignore the not numeric keys, "Lobos" answer is a step in the right direction, but reset too the not numeric keys by level 2 and lower. for me this done the job perfect
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;
}
Upvotes: 1
Reputation: 559
You really need to add the is_numeric condition to stop text keys getting mixed up...
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;
}
I did this instead:
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;
}
}
Upvotes: 21
Reputation: 52372
function fix_keys($array) {
foreach ($array as $k => $val) {
if (is_array($val))
$array[$k] = fix_keys($val); //recurse
}
return array_values($array);
}
Upvotes: 16
Reputation: 393
I was trying to fix the same problem, here is the code
$array = array_values($array);
Upvotes: 12