递归函数和多维数组
我如何从所有子元素获取['id'],如果我通过它的id。
这是我的阵列...
$array = Array
(
'0' => Array
(
'id' => 1,
'parent_id' => 0,
'order_pos' => 0,
'title' => 'Shirts',
'childs' => Array
(
'0' => Array
(
'id' => 2,
'parent_id' => 1,
'order_pos' => 0,
'title' => 'Small Shirts',
)
)
),
'1' => Array
(
'id' => 3,
'parent_id' => 0,
'order_pos' => 0,
'title' => 'Cameras'
)
);
如果我写我的功能,并通过一个变量说ID 1可以有人请告诉我如何我可以返回一个单一的维数组只有所有的子元素的ID ..例如。
从前面的数组中,如果我传递1的id,我想让函数返回1,2,因为2是一个子元素的id元素。 所以如果我通过它2,它应该只返回2,因为它没有任何孩子。
我希望你能理解我,谢谢你,如果你能帮助我...
请注意,这可以是无限的,这意味着每个父类别可以有无限的子类别或子级。
基本上有两个问题需要解决:
这将工作:
function findIds(array $array, $id)
{
$ids = array();
$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($array),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $val) {
if (is_array($val) && isset($val['id']) && $val['id'] === $id) {
$ids[] = $val['id'];
if (isset($val['childs'])) {
array_walk_recursive(
$val['childs'],
function($val, $key) use (&$ids) {
if ($key === 'id') {
$ids[] = $val;
}
}
);
}
}
}
return $ids;
}
print_r( findIds($array, 1) ); // [1, 2]
print_r( findIds($array, 2) ); // [2]
print_r( findIds($array, 3) ); // [3]
迭代器将使你的数组完全遍历。 这意味着,你可以在整个阵列上进行foreach
,就像它是一个平坦的阵列。 通常情况下,它只会返回叶子( SELF_FIRST
,Shirts,...),但是因为我们给了它SELF_FIRST
选项,它还会返回持有叶子的数组。 尝试把一个var_dump
放在foreach中看看。
换句话说,这个
foreach ($iterator as $val) {
将会遍历数组中的每个值。
if (is_array($val) && isset($val['id']) && $val['id'] === $id) {
这一行只会考虑数组并检查您传递给findById
函数的ID。 如果存在,则将ID添加到该函数将返回的数组中。 因此,这将解决问题1:找到从哪里开始。
if (isset($val['childs'])) {
如果数组有一个“孩子”(它应该是孩子btw)的项目,它将递归地从该项目中获取所有ID并将它们添加到返回的数组中:
array_walk_recursive(
$val['childs'],
function($val, $key) use (&$ids) {
if ($key === 'id') {
$ids[] = $val;
}
}
);
array_walk_recursive
接受一个数组(第一个参数),并将叶子的值和键传递给回调函数(第二个参数)。 回调函数只检查叶子是否为ID值,然后将其添加到返回数组中。 正如你所看到的,我们正在使用对返回数组的引用。 这是因为使用use ($ids)
会在封闭范围中创建数组的副本,而我们需要真实数组来为其添加项目。 这将解决问题2:添加所有的孩子ID。
上一篇: Recursive functions and multidimensional arrays
下一篇: how to hide a td when dynamically getting data in php codeigniter?