PHP: цикл foreach с array_merge для создания объектов json

Я новичок в php, но мне очень нравится, пока! Теперь я наткнулся на проблему с array_merge,

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

  $tables = array("buildings", "medical", "other", "tools", "traps", "weapons"); 

    foreach ($tables as $table) {

        // Get tables from database
        $sth = $db->query("SELECT * FROM $table");
        $result = $sth->fetchAll();

        // Merge arrays together
        if ($arr === null) {
            //echo "its 0 <br/> ";
            $arr = array( "$table" => $result );
        } else {
            //echo "more than 0 <br/> ";
            $arr2 = array( "$table" => $result );
            $merge = array_merge($arr, $arr2);
        }

    } //End loop

    echo $merge;

Пока это работает как-то, мне удается заставить первый стол "здания" и последний стол "оружие" отображаться так, как я хочу идеально!

Но я не понимаю, почему это перепрыгивает через другие.. Я считаю, что это как-то связано с $arr2 и что мне нужно указать уникальный массив для каждой из таблиц. Но как мне этого добиться? Это путь или есть более эффективный способ достичь этого? Спасибо!

5 ответов

Решение

Это терпит неудачу из-за этой линии

    $merge = array_merge($arr, $arr2);

Ваше слияние всегда является слиянием $arr (который является первой записью в $tables) и $arr2, который является последней обрабатываемой записью. Вы не объединяете данные с ранее объединенными данными, такими как

    $arr = array_merge($arr, $arr2)

Кроме того, вы можете избавиться от логики if/else, просто начав с установки $ arr в пустой массив для запуска.

    $arr = array();

Вы можете поместить все в уникальный массив, например:

$myArray["$table"] = $result;

Если я правильно понимаю...

Вместо этого две строки

$arr2 = array( "$table" => $result );
$merge = array_merge($arr, $arr2);

Вы можете попробовать это:

$tables[$table] = $result;
$tables = array("buildings", "medical", "other", "tools", "traps", "weapons"); 
$tableArr = array();
foreach ($tables as $table) {

    // Get tables from database
    $sth = $db->query("SELECT * FROM $table");
    $result = $sth->fetchAll();

    if(isset($result)){
        $tableArr[$table] = $result;
    }else{
        $tableArr[$table] = '';
    }


} //End loop

print_r($tableArr);

Создайте новый массив и установите индекс в качестве имени таблицы и сохраните его результат в этом массиве.

Ваш код может быть значительно упрощен.

$tables = array("buildings", "medical", "other", "tools", "traps", "weapons"); 
foreach ($tables as & $table) {
    $table = $db->query("SELECT * FROM $table")->fetchAll();
}
echo json_encode($tables);

Конечно, вам все еще нужно проверять ошибки (ошибки базы данных и JSON), чтобы код был надежным, но чем проще, тем лучше. Простое это хорошо, особенно когда дело доходит до программирования.

Другие вопросы по тегам