我在 CodeIgniter(CI)中工作,并尝试为下拉列表创建一组嵌套的类别项。要创建下拉框,请在 CI 中echo form_dropdown('name', $array, $selectedID)
。
这是我创建嵌套列表数组的函数:
$categoryData = array();
function list_categories($cats, $sub = ''){
foreach($cats as $cat){
//$cat['category']->id = $sub.$cat['category']->title;
$categoryData[$cat['category']->id] = $sub.$cat['category']->title;
if( sizeof($cat['children']) > 0 ){
$sub2 = str_replace('—→ ', '–', $sub);
$sub2.= '–→ ';
list_categories($cat['children'], $sub2);
}
}
}
如果我在var_dump($categoryData);
函数内foreach
之后立即执行list_categories()
,它将返回嵌套集的数组。所以在函数内使用var_dump()
时这是可以的。但我需要这样做:
<?php
list_categories($categories);
var_dump($categoryData);
?>
这里我得到一个空数组,这是一个输出:
array (size=0)
empty
有人能告诉我这里做错了吗?
答案 0 :(得分:3)
您的函数修改本地副本,应将其返回到全局范围。您希望实现的目标可能是globals
(“不良做法”),return
或references
。
尝试使用references
:
function list_categories(&$result, $cats, $sub = ''){ // <- THIS
foreach($cats as $cat){
//$cat['category']->id = $sub.$cat['category']->title;
$result[$cat['category']->id] = $sub.$cat['category']->title; // <- THIS
if( sizeof($cat['children']) > 0 ){
$sub2 = str_replace('—→ ', '–', $sub);
$sub2.= '–→ ';
list_categories($result, $cat['children'], $sub2); // <- THIS
}
}
}
$categoryData = array();
list_categories($categoryData, $categories); // <- THIS
UPD: 最后,对于recusive函数,引用更好(就我而言)。很抱歉给您带来不便。
答案 1 :(得分:0)
function list_categories($cats, $sub = ''){
global $categoryData; // add this
如果不这样做,函数看不到全局$ categoryData,而是创建一个本地的。它没有回来。
请注意,建议尽量少使用全局变量来避免spagetthi代码。