#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
)
)
Комментарии:
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);
, вы увидите, что результат соответствует вашим ожиданиям.