递归地向数组添加值
Recursively add value to an array
我想将子元素 ID 获取到一个数组中。
从我的 table,id 5 是 id (4, 11) 的父级,id 4 是 id 9 的父级。
如果我用 id 5 调用 childCategoryIds() 函数,它应该 return [11, 9, 4],但是
它是 returning [11, 4]。我的函数和 sql 数据如下所示:
Table:
id parent_id name
4 5 Cat Four
5 1 Cat Five
9 4 Cat Nine
11 5 Cat Eleven
我的函数:
function childCategoryIds($id){
$ci = & get_instance();
$ci->load->database();
$child_category_ids = array();
$ci->db->where('parent_id', $id)->order_by('id', 'DESC');
$query = $ci->db->get('categories');
$result = $query->result();
foreach ($result as $res):
childCategoryIds($res->id);
$child_category_ids[] = $res->id;
// var_dump($res->id);
endforeach;
return $child_category_ids;
}
我已经从我的控制器调用了这个函数。
childCategoryIds(5); /* here id = 5 */
来自函数 $child_category_ids return id (11, 4)。但是 var_dump($res->id) 将所有 id (11, 9, 4) 显示到循环中。据我所知,循环 运行 只进入函数一次,或者当函数调用自身进入循环时,它无法将其 id 推送到 $child_category_ids。
我从这个函数得到了以下结果。
array(2) {
[0] => string(2) "11"
[1] => string(1) "4"
}
但我的预期结果是:
array(2) {
[0] => string(2) "11"
[1] => string(1) "9"
[2] => string(1) "4"
}
我有一些类似的问题,但找不到解决方案。
问题出在作用域上,函数中声明的变量在函数外部看不到(即使递归调用)。如果你转储 childCategoryIds($res->id);
你可能会看到检索到的信息,只是没有存储在数组中。
您可以尝试 array_merge
之类的方法将数据拉入同一个数组,或者简单地遍历结果并将它们添加如下:
$result = $query->result();
foreach ($result as $res):
$children = childCategoryIds($res->id);
$child_category_ids = array_merge($child_category_ids, $children);
$child_category_ids[] = $res->id;
// var_dump($res->id);
endforeach;
或
$result = $query->result();
foreach ($result as $res):
$children = childCategoryIds($res->id);
foreach ($children as $child) {
$child_category_ids [] = $child;
}
$child_category_ids[] = $res->id;
// var_dump($res->id);
endforeach;
我想将子元素 ID 获取到一个数组中。 从我的 table,id 5 是 id (4, 11) 的父级,id 4 是 id 9 的父级。 如果我用 id 5 调用 childCategoryIds() 函数,它应该 return [11, 9, 4],但是 它是 returning [11, 4]。我的函数和 sql 数据如下所示:
Table:
id parent_id name
4 5 Cat Four
5 1 Cat Five
9 4 Cat Nine
11 5 Cat Eleven
我的函数:
function childCategoryIds($id){
$ci = & get_instance();
$ci->load->database();
$child_category_ids = array();
$ci->db->where('parent_id', $id)->order_by('id', 'DESC');
$query = $ci->db->get('categories');
$result = $query->result();
foreach ($result as $res):
childCategoryIds($res->id);
$child_category_ids[] = $res->id;
// var_dump($res->id);
endforeach;
return $child_category_ids;
}
我已经从我的控制器调用了这个函数。
childCategoryIds(5); /* here id = 5 */
来自函数 $child_category_ids return id (11, 4)。但是 var_dump($res->id) 将所有 id (11, 9, 4) 显示到循环中。据我所知,循环 运行 只进入函数一次,或者当函数调用自身进入循环时,它无法将其 id 推送到 $child_category_ids。
我从这个函数得到了以下结果。
array(2) {
[0] => string(2) "11"
[1] => string(1) "4"
}
但我的预期结果是:
array(2) {
[0] => string(2) "11"
[1] => string(1) "9"
[2] => string(1) "4"
}
我有一些类似的问题,但找不到解决方案。
问题出在作用域上,函数中声明的变量在函数外部看不到(即使递归调用)。如果你转储 childCategoryIds($res->id);
你可能会看到检索到的信息,只是没有存储在数组中。
您可以尝试 array_merge
之类的方法将数据拉入同一个数组,或者简单地遍历结果并将它们添加如下:
$result = $query->result();
foreach ($result as $res):
$children = childCategoryIds($res->id);
$child_category_ids = array_merge($child_category_ids, $children);
$child_category_ids[] = $res->id;
// var_dump($res->id);
endforeach;
或
$result = $query->result();
foreach ($result as $res):
$children = childCategoryIds($res->id);
foreach ($children as $child) {
$child_category_ids [] = $child;
}
$child_category_ids[] = $res->id;
// var_dump($res->id);
endforeach;