如何使用函数填充数组,并在函数外部使用该数组?

时间:2013-05-15 07:03:16

标签: php arrays codeigniter nested-lists

我在 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

有人能告诉我这里做错了吗?

2 个答案:

答案 0 :(得分:3)

您的函数修改本地副本,应将其返回到全局范围。您希望实现的目标可能是globals(“不良做法”),returnreferences

尝试使用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('&mdash;&rarr;&nbsp;', '&ndash;', $sub);
            $sub2.= '&ndash;&rarr;&nbsp;';

            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代码。