Эффективный способ удалить ключ-значение из массива массивов

#php #arrays #unset #array-unset

#php #массивы #сбросить значение #массив-сбросить значение

Вопрос:

У меня есть массив из 50000 массивов, и я хочу удалить пару ключ-значение «id» из каждого из них.

Я бы предпочел не перебирать 50 тысяч элементов и задавался вопросом, есть ли эффективный способ сделать это.

 Array
(
    [0] => Array
        (
            [id] => 713061
            [market] => usd-btc
            [price] => 3893.69
        )

    [1] => Array
        (
            [id] => 713056
            [market] => usd-btc
            [price] => 3893.69
        )

    [2] => Array
        (
            [id] => 713051
            [market] => usd-btc
            [price] => 3893.69
        )

    [3] => Array
        (
            [id] => 713046
            [market] => usd-btc
            [price] => 3893.69
        )

    [4] => Array
        (
            [id] => 713041
            [market] => usd-btc
            [price] => 3892.95
        )

    [5] => Array
        (
            [id] => 713036
            [market] => usd-btc
            [price] => 3892.95
        )
  

Я пробовал оба следующих, но, похоже, не работает:

 // Remove ID
        foreach($server_data as $sd)
        {
            unset($sd['id']);
        }

        unset($server_data['id']);

        PRINT_R($server_data);
  

$server_data по-прежнему возвращает массив с элементом $id;

Есть мысли?

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

1. Два вопроса — почему это там и почему вы пытаетесь это удалить?

2. Я бы предпочел не перебирать 50k элементов ну, либо вам придется, либо встроенной функции PHP, которую вы можете вызвать, придется

3. Возможно, было бы лучше посмотреть, как вы создали этот массив, а затем просто НЕ добавлять id в первую очередь

4. @kuh-chan — идентификатор поступает с онлайн-сервера, с которого я извлекаю данные — мне это нужно, чтобы разбить fetchData на несколько частей. Я пытаюсь удалить его, поскольку в моей LocalDB уже есть идентификатор автоматического увеличения

5. То, что вы используете его для разделения данных, не означает, что вы должны добавлять его к результирующим данным

Ответ №1:

Это создает копию подмассива, поэтому при его изменении основной массив не затрагивается:

 foreach ($server_data as $sd)
{
    unset($sd['id']);
}
  

Вы можете отменить настройку из исходного массива:

 foreach (array_keys($server_data) as $index)
{
    unset($server_data[$index]['id']);
}
  

Или передайте подмассиву ссылку, чтобы оригинал был изменен:

 foreach ($server_data as amp;$sd)
{
    unset($sd['id']);
}
  

Или, более кратко:

 array_walk($server_data, function (amp;$item) { unset($item['id']); });
  

Ответ №2:

Я не могу придумать причин для его удаления (просто проигнорируйте его), однако вы можете запустить его через обратный вызов, который удаляет id и возвращает остальное:

 $server_data = array_map(function($v) { unset($v['id']); return $v; }, $server_data);