0

私はCodeIgniter (CI)で作業しており、ドロップダウン リストのネストされたカテゴリ項目のセットを作成しようとしています。ドロップダウン ボックスを作成するには、CIecho 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);直後に を実行すると、ネストされたセットの配列が返されます。したがって、関数内で使用する場合はこれで問題ありません。しかし、私はこれを行う必要があります:foreachlist_categories()var_dump()

<?php
    list_categories($categories);
    var_dump($categoryData);
?>

そして、ここで空の配列を取得します。出力は次のとおりです。

array (size=0)
  empty

誰かが私がここで間違っていることを教えてもらえますか?

4

2 に答える 2

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

            list_categories($result, $cat['children'], $sub2); // <- THIS
        }
    }
}

$categoryData = array();

list_categories($categoryData, $categories); // <- THIS

UPD:結局のところ、再帰関数については、参照の方が優れています (私の場合)。ご不便をおかけして申し訳ありません。

于 2013-05-15T07:04:36.273 に答える
0

あなたがすべき:

function list_categories($cats, $sub = ''){
global $categoryData;  // add this

そうしないと、関数はグローバルな $categoryData を認識せず、代わりにローカルの $categoryData を作成します。それは返されません。

スパゲッティ コードを回避するために、グローバル変数の使用を最小限に抑えることをお勧めします。

于 2013-05-15T07:11:32.053 に答える