Обновление базы данных JSON с потерей ключевых значений

#php #arrays #json #database

#php #массивы #json #База данных

Вопрос:

Я получил это в своей базе данных (23 — это мой идентификатор изображения):

 {"23" : {"13x18":"5","20X30":"5","30x45":"4","digital":"4"}}
  

Я хочу добавить другие данные, похожие на этот, в том же месте, чтобы это выглядело так :

 ["23" : {"13x18":"5","20X30":"5","30x45":"4","digital":"4"}, 
"42" : {"13x18":"2","20X30":"1","30x45":"3","digital":"1"}]
  

Вот код, который используется :

 $clientChoice = [];
$clientChoice[$post['picId']] = $test;
$select = (new GalleryCategoriesModel)->findByUrl($post['url']);
if($select['clientChoice'] != null){
    $tabs = json_decode($select['clientChoice'], true);
    $new = array_merge($tabs, $clientChoice);
    $chosen = json_encode($new);
} else {
    $chosen = json_encode($clientChoice);
}
$update = (new GalleryCategoriesModel)->update(['clientChoice'=>$chosen], $post['id']);
  

И вот результат, который я получил с этим :

 [{"13x18":"5","20X30":"5","30x45":"4","digital":"4"},
{"13x18":"2","20X30":"1","30x45":"3","digital":"1"}]
  

Что я упускаю или делаю неправильно?

—————— ИСПРАВЛЕНИЕ ——————

Благодаря данному ответу, вот что я делаю сейчас :

     $clientChoice = [];
    $clientChoice[$post['picId']] = $test;

    $select = (new GalleryCategoriesModel)->findByUrl($post['url']);

    if($select['clientChoice'] != null){
        $tabs = json_decode($select['clientChoice'], true);
        $new = $tabs   $clientChoice;
        $chosen = json_encode($new);
    } else {
        $chosen = json_encode($clientChoice);
    }

    $update = (new GalleryCategoriesModel)->update(['clientChoice'=>$chosen], $post['id']);
  

И вот что я получил в своей БД :

 {"25":{"13x18":"1","20X30":"3","30x45":"5","digital":"1"},
"37":{"13x18":"4","20X30":"8","30x45":"3","digital":"2"}}
  

Ответ №1:

Ваша проблема связана с вашим вызовом array_merge . Из руководства:

Значения во входных массивах с цифровыми ключами будут перенумерованы с помощью увеличивающихся ключей, начиная с нуля в результирующем массиве

Итак, ваши два массива, которые имеют ключи 23 и 42 в конечном итоге объединяются как:

 Array
(
    [0] => Array
        (
            [13x18] => 5
            [20X30] => 5
            [30x45] => 4
            [digital] => 4
        )
    [1] => Array
        (
            [13x18] => 2
            [20X30] => 1
            [30x45] => 3
            [digital] => 1
        )
)
  

Вы можете обойти это, используя оператор объединения массивов ( ), который сохранит ключи из обоих массивов (хотя он будет игнорировать $clientChoice , если ключ совпадает с уже существующим в $tabs ), однако, поскольку они являются id значениями, я предполагаю, что этого не должно происходить.

 $new = $tabs   $clientChoice;
  

В этом случае $new содержит:

 Array
(
    [23] => Array
        (
            [13x18] => 5
            [20X30] => 5
            [30x45] => 4
            [digital] => 4
        )
    [42] => Array
        (
            [13x18] => 2
            [20X30] => 1
            [30x45] => 3
            [digital] => 1
        )
)
  

Демонстрация на 3v4l.org

Комментарии:

1. Большое вам спасибо, иногда это прямо перед нами, и мы это видим 🙂 я редактирую с вашим исправлением. PS: (конечный результат в моей базе данных не находится между [ ], но я получил свой идентификатор и свои размеры) {«25»: {«13×18″:»1», «20X30»: «3», «30×45»: «5», «digital»:»1″}, «37»:{«13×18»: «4», «20X30»: «8», «30×45»: «3», «цифровой»: «2»}}

2. @Shogu23 действительно, иногда вам просто нужна вторая пара глаз. Что касается вывода, я напечатал массивы, а не JSON, если вы отредактируете демонстрацию, которую я дал echo $chosen; вместо print_r($new); , вы увидите, что результат соответствует вашим ожиданиям.