Удалить объект из массива объектов по значению

304
12 февраля 2020, 10:50

basket.json

[
  {
    "item": 13
  },
  {
    "item": 12
  }
]

код:

$posted_value = 13;
$basketJson = file_get_contents('basket.json');
$usedBasket = json_decode($basketJson, true);
foreach ( $usedBasket as $basket ) {
    foreach ( $basket as $key => $value ) {
        if (( $key = array_search($posted_value, $value)) !== false ) {
            unset($basket[$key]);
        }
    }
}
file_put_contents('basket.json', json_encode($usedBasket));

но в файле также остался объект со значением 13. Что не так?

Answer 1

В foreach по умолчанию передаётся копия массива. Что бы получить доступ к исходному массиву, нужно добавить амперсанд в обеих циклах:

foreach ($usedBasket as &$basket)

и

foreach ($basket as $key => &$value)

Если вы изменяете только $basket, то во втором цикле амперсанд можно не добавлять.

Для модификации массива было бы удобнее вместо foreach() использовать for() хотя бы потому, что бы не удалять после цикла оставшиеся ссылки. Например:

$posted_value = 13;
$basketJson = '[
  {
    "item": 13
  },
  {
    "item": 12
  }
]';
$usedBasket = json_decode($basketJson, true);
for ($i = 0, $all = count($usedBasket); $i < $all; $i++) {
    if ($usedBasket[$i]['item'] === $posted_value) {
        unset($usedBasket[$i]);
    }
}
$usedBasket = array_values($usedBasket);
var_dump($usedBasket);

Результат:

array(1) {
  [0]=> array(1) {
    ["item"]=> int(12)
  }
}
READ ALSO
Проблема с миграцией баз данных в Laravel

Проблема с миграцией баз данных в Laravel

при миграции базы постоянно выдает вот такую ошибку, не понимаю что нужно исправить

316
Маршрутизация Laravel

Маршрутизация Laravel

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

211
Telegram боты: общаться с ботом при помощи апи

Telegram боты: общаться с ботом при помощи апи

Всем известно, что в telegram можно создавать ботов, которые будут общаться с юзером, показывая ему различные кнопки

224