0

PHPを使用して、次のテーブルデータをネストされた配列に変換しようとしています。私はほぼ完了しましたが、ある時点で立ち往生しています。

id  name                    parent
1   Apparel                                                                   
2   Appliances                                                                
46  Apparel                 1                                                 
47  Child Apparel           46                                                
49  Child Apparel 2         47        

このコードの使用

$cats = array(); // from database

$refs = array();
$rcats = array();

foreach ($cats as $cat) {
    $thisref = &$refs[$cat['id']];

    $thisref['id'] = $cat['id'];
    $thisref['name'] = $cat['name'];
    $thisref['leaf'] = "true";

    if (!$cat['parent']) {
        $rcats[$cat['id']] = &$thisref;
    } else {
        unset($refs[$cat['parent']]['leaf']);
        $refs[$cat['parent']]['items'][$cat['id']] = &$thisref;
    }
}          

print_r(json_encode($rcats));                             

これにより、次の JSON が生成されます。

{
    "1": {
        "id": "1",
        "name": "Apparel",
        "items": {
            "46": {
                "id": "46",
                "name": "Apparel",
                "items": {
                    "47": {
                        "id": "47",
                        "name": "Child Apparel",
                        "items": {
                            "49": {
                                "id": "49",
                                "name": "Child Apparel 2",
                                "leaf": "true"
                            }
                        }
                    }
                }
            }
        }
    },
    "2": {
        "id": "2",
        "name": "Appliances",
        "leaf": "true"
    }
}

JSONが好きな場所

[
    {
        "id": "1",
        "name": "Apparel",
        "items": [
            {
                "id": "46",
                "name": "Apparel",
                "items": [
                    {
                        "id": "47",
                        "name": "Child Apparel",
                        "items": [
                            {
                                "id": "49",
                                "name": "Child Apparel 2",
                                "leaf": "true"
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "id": "2",
        "name": "Appliances",
        "leaf": "true"
    }
]
4

2 に答える 2

1

私が間違っている?:p

$cats      = array(); // From Database, but i use this
$cats      = array(
    array(
        'id'        => 1,
        'name'      => 'Jakarta',
        'parent'    => NULL
    ),
    array(
        'id'        => 2,
        'name'      => 'Bandung',
        'parent'    => 1
    ),
    array(
        'id'        => 3,
        'name'      => 'Surabaya',
        'parent'    => 1
    ),
    array(
        'id'        => 4,
        'name'      => 'Bali',
        'parent'    => NULL
    ),
    array(
        'id'        => 5,
        'name'      => 'Batam',
        'parent'    => NULL
    ),
);
$refs        = array();
$rcats   = array();

foreach ($cats as $cat) {
    $thisref            = &$refs[$cat['id']];
    $thisref['id']  = $cat['id'];
    $thisref['name']    = $cat['name'];
    $thisref['leaf']    = "true";

    if (!$cat['parent']) {
        $rcats[] = &$thisref;
    } 
    else {
        unset($refs[$cat['parent']]['leaf']);
        $refs[$cat['parent']]['items'][] = &$thisref;
    }
}      

/*
// IF YOU NEED CHANGE TO OBJECT

$rcats = (object)$rcats;
if(isset($rcats->items)){
    $rcats->items = (object)$rcats->items;
}
*/

header('Content-type: application/json');
print_r(json_encode($rcats));
于 2012-03-22T06:51:44.713 に答える
0

ここでは、最終結果を $refs に保存していると仮定しています

print_r(json_encode(array_values($rcats)));

for ループですべてのインデックスを取り出したい場合[]は、id の代わりに次のようにします。

if (!$cat['parent']) {
    $rcats[] = &$thisref;
} else {
    unset($refs[$cat['parent']]['leaf']);
    $refs[$cat['parent']]['items'][] = &$thisref;
}

私がスローする簡単な例:

<?php

$a = array('1' => array('a' => 3), '2' => array('b' => 4));
echo json_encode($a) . "\n";
echo json_encode(array_values($a)) . "\n";

出力:

{"1":{"a":3},"2":{"b":4}}
[{"a":3},{"b":4}]
于 2012-03-22T06:45:24.613 に答える