0

CSVファイルを調べて、各行を配列として別の配列(ネストされた配列?)に配置するスクリプトがあります。各行には、その行のアイテムのカテゴリ用に2〜3個のフィールドがあります。これらのカテゴリから多次元配列を作成する方法を試しています。これが私が現在持っている情報源です:

$csv = new File_CSV_DataSource;
if ($csv->load($file)) {
    $items = $csv->getHeaders();
    $csv->getColumn($items[2]);
    if ($csv->isSymmetric()) {
        $items = $csv->connect();
    } else {
        $items = $csv->getAsymmetricRows();
    }
    $items = $csv->getrawArray();
}

$mainCats = array();
$subCats = array();
$subSubs = array();

foreach($items as $item){
    if(!in_array($item[10], $mainCats)){
        $mainCats[] = $item[10];
    }
}

foreach($items as $item){
    if(!array_key_exists($item[11], $subCats)){
        $parent = array_search($item[10], $mainCats);
        $subCats[$item[11]] = $parent;
    }
}

foreach($items as $item){
    if(!array_key_exists($item[12], $subSubs)){
        $parent = array_search($item[11], array_keys($subCats));
        $subSubs[$item[12]] = $parent;
    }
}

これまでのところ、次の形式で3つの配列を作成しています。

$mainCats = Array(
    [0] => Main Cat 1,
    [1] => Main Cat 2,
    [2] => Main Cat 3
);

$subCats = Array(
    [Sub Cat 1] => 0,
    [Sub Cat 2] => 1,
    [Sub Cat 3] => 2
);

$subSubs = Array(
    [Sub Sub 1] => 0,
    [Sub Sub 2] => 1,
    [Sub Sub 3] => 2
);

最後の2つの配列のそれぞれの数値は、前の配列の親カテゴリのインデックスです。私がやりたいのは、それらすべてを次の形式の1つの大きな配列にマージすることです。

$cats = Array(
    [0] => Array(
        'name' => Main Cat 1,
        'subs' => Array(
            [0] => Array(
                'name' => Sub Cat 1,
                'subs' => Array(
                    'name' => Sub Sub 1
                )
            )
        )
    ),
    [1] => Array(
        'name' => Main Cat 2,
        'subs' => Array(
            [0] => Array(
                'name' => Sub Cat 2,
                'subs' => Array(
                    'name' => Sub Sub 2
                )
            )
        )
    ),
    [2] => Array(
        'name' => Main Cat 3,
        'subs' => Array(
            [0] => Array(
                'name' => Sub Cat 3,
                'subs' => Array(
                    'name' => Sub Sub 3
                )
            )
        )
    ),
);

これを行うにははるかに効率的な方法が必要であることを私は知っていますが、それを理解することはできません。

編集-すべての行に3番目のカテゴリフィールド値があるわけではないことにも言及する必要があります。

4

1 に答える 1

0

私はそれらを名前で索引付けすることを好みます:

$cats=array();
//--------
foreach($items as $item){
        $main=$item[10];
        $subCat=$item[11];
        $subSub[$item[12]];
        $cats[$main]['subs'][$subCat]['subsubs'][$subSub]['name']=$subSub;
        $cats[$main]['subs'][$subCat]['name']=$subCat;
        $cats[$main]['name']=$main;



}
于 2012-12-10T04:14:23.993 に答える