Как создать вложенный массив Json из ассоциативного массива в PHP - PullRequest
1 голос
/ 11 июля 2019

Я настраиваю файловый браузер и хочу проанализировать массив JSON, чтобы получить иерархию папок, но не могу создать нужную структуру в массиве JSON из ассоциативного массива.

Это два ассоциативных массива, которые я выбрал из базы данных.

$directory  = Array ( [0] => stdClass Object ( [dir_name] => Car [dir_id] => car ) [1] => stdClass Object ( [dir_name] => Bus [dir_id] => bus ) )

$subdirectory = Array ( [0] => stdClass Object ( [sub_name] => Toyota [sub_id] => toyota [dir_id] => car) [1] => stdClass Object ( [sub_name] => Volvo [sub_id] => volvo [dir_id] => bus) )

Я пробовал вот так

$parentdirectory = [];
$parentfolder = [];
$subf = [];
$subfolder = [];

foreach ($directory  as $dir) {
  $parentdirectory['id'] = $dir->id;
  $parentdirectory['value'] = $dir->name;
  foreach (subdirectory as $sub) {
    if ($dir->dir_id == $sub->dir_id) {
      $subfolder['id'] = $sub->sub_id;
      $subfolder['value'] = $sub->sub_name;
      array_push($subf, $subfolder);
      array_push($parentdirectory, $subf);
    }
  }
  array_push($parentfolder, $parentdirectory);
}

echo json_encode($parentfolder);

На самом деле, я хочу массив JSON, какэто

[
    {
        id: "car",
        value: "Car",
        data: [{
            id: "toyota",
            value: "Toyota"
        }]
    },
    {
        id: "bus",
        value: "Bus",
        data: [{
            id: "volvo",
            value: "Volvo"
        }]
    }
]

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Ваш цикл foreach внутри цикла foreach неэффективен. Сначала создайте массив данных, просматривая подкаталог $, а затем переберите каталог $, чтобы получить фактический формат.

$dataArray = array();
$parentfolder = array();

foreach( $subdirectory as $sub ) {
    $dirName = $sub->dir_id;
    if( !isset( $dataArray[$dirName] ) ) {
        $dataArray[$dirName] = array();
    }
    $dataArray[$dirName][] = array('id' => $sub->sub_id, 'value' => $sub->sub_name);
}

foreach ($directory  as $dir ) {
    $dirName = $dir->dir_id;
    if( isset ( $dataArray[$dirName] ) ) {
        $data = $dataArray[$dirName];
    } else {
        $data = array();
    }
    $parentfolder[] = array('id' => $dir->dir_id, 'value' => $dir->dir_name, 'data' => $data);
}

echo json_encode($parentfolder);
0 голосов
/ 11 июля 2019

Я думаю, вам следует сначала установить data как array, например:

$parentfolder= array();
    foreach ($directory  as $dir) {
        $row_array = array();
        $row_array["id"] = $dir[id];
        $row_array["data"] = array();
            foreach (subdirectory as $sub) {
                if ($dir["id"] == $sub["dir_id"]) {
                    $row_array["data"][] = array(
                        //and so on..
                    );
                }
            }
        array_push($parentfolder, $row_array);
    }
...