Есть ли простой способ удалить элемент из массива с помощью PHP, чтобы foreach ($array) больше не содержал этот элемент?

Я думал, что установка на null поможет, но, видимо, это не работает.

2838
Ben 15 Дек 2008 в 23:28
38
Легкость поиска в руководстве не исключает вопроса о StackOverflow. Если бы вопрос был повторяющимся вопросом StackOverflow, он мог бы здесь не подходить. StackOverflow - хорошее место, где можно найти ответы еще до того, как заглянуть в руководство.
 – 
Dan Nissenbaum
11 Фев 2014 в 09:18
6
@unset ($ array [$ key]); $ array = array_values ​​($ массив);
 – 
trojan
4 Сен 2014 в 16:55
1
Если вы хотите удалить ключи из массива массива (ассоциативный массив), см. Решение на странице stackoverflow.com/a/47978980/1045444
 – 
Somnath Muluk
26 Дек 2017 в 16:10
2
Вы можете сделать это в цикле foreach следующим образом: pastefs.com/pid/130950
 – 
Aurangzeb
25 Июн 2019 в 13:50

20 ответов

Следует отметить, что unset() сохранит индексы нетронутыми, чего и следовало ожидать при использовании строковых индексы (массив как хеш-таблица), но это может быть довольно неожиданным при работе с целочисленными индексированными массивами:

$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [3]=>
  int(3)
} */

$array = array(0, 1, 2, 3);
array_splice($array, 2, 1);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */

Таким образом, array_splice() можно использовать, если вы хотите нормализовать целочисленные ключи. Другой вариант - использовать array_values() после unset():

$array = array(0, 1, 2, 3);

unset($array[2]);
$array = array_values($array);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */
1383
Ry- 13 Янв 2012 в 21:32
45
Стоит отметить, что когда вы используете array_splice (), вам нужно знать OFFSET, а не ключ, а смещение (!) Любого элемента, который вы хотите удалить.
 – 
Tom
9 Июн 2012 в 01:57
20
@Tom: для обычного массива (с непрерывным целочисленным индексом) смещение - это индекс. Вот где array_splice может иметь смысл (среди прочего).
 – 
Stefan Gehrig
9 Июн 2012 в 16:18
5
Да, конечно, но просто кое-что нужно запомнить, если вы вмешаетесь в массив перед использованием сплайсинга.
 – 
Tom
9 Июн 2012 в 20:12
$key = array_search($needle, $array);
if ($key !== false) {
    unset($array[$key]);
}
219
Peter Mortensen 19 Фев 2019 в 13:54
6
Было бы хорошо уточнить, что этот ответ предназначен для удаления элемента, когда вы знаете значение, но не ключ. Обратите внимание, что он удаляет только ПЕРВЫЙ экземпляр значения; чтобы найти все ключи для значения, используйте array_keys < / а>
 – 
ToolmakerSteve
24 Сен 2016 в 21:09
unset($array[$index]);
97
Eran Galperin 15 Дек 2008 в 23:31

Если у вас есть массив с числовым индексом, в котором все значения уникальны (или они не уникальны, но вы хотите удалить все экземпляры определенного значения), вы можете просто использовать array_diff () для удаления соответствующего элемента, например:

$my_array = array_diff($my_array, array('Value_to_remove'));

Например:

$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);

Это отображает следующее:

4
3

В этом примере элемент со значением Charles удаляется, что можно проверить с помощью вызовов sizeof (), которые сообщают размер 4 для исходного массива и 3 после удаления.

69
Robin Nixon 26 Ноя 2012 в 12:25

Также для именованного элемента:

unset($array["elementName"]);
68
Mohammad 13 Ноя 2018 в 14:05
$a = array("A"=>1, "B"=>2, "C"=>"a"); print_r($a); unset($a["B"]); print_r($a); дает (отформатировано): Array ( [A] => 1 [B] => 2 [C] => a ), Array ( [A] => 1 [C] => a )
 – 
DefenestrationDay
9 Июн 2011 в 05:50
Кажется, вы не можете сбросить элементы массива, проиндексированные строкой (генерирует «Неустранимая ошибка: невозможно сбросить смещения строки»). Я не думаю, что так было всегда, но, конечно, начиная с PHP 5.3.10 и, возможно, раньше
 – 
carpii
6 Апр 2012 в 04:29
7
PHP может удалять элементы из ассоциативного массива. Фатальная ошибка возникает, когда вы пытаетесь использовать unset ($ var ['key']) в строке вместо массива. Например: $ array = array ('test' => 'value', 'another' => ' ценить', ); unset ($ array ['test']); // Удаляет элемент "test" из массива, как ожидалось $ array = 'test'; unset ($ array ['test']); // Выдает сообщение «Неустранимая ошибка: невозможно отменить смещение строки», как ожидалось
 – 
Jimbo
20 Мар 2013 в 13:56

Уничтожить отдельный элемент массива

unset()

$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);

Результат будет:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [3]=>
  string(1) "D"
  [4]=>
  string(1) "E"
}

Если вам нужно переиндексировать массив:

$array1 = array_values($array1);
var_dump($array1);

Тогда вывод будет:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "D"
  [3]=>
  string(1) "E"
}

Извлечь элемент за пределы массива - вернуть значение удаленного элемента.

mixed array_pop(array &$array)

$stack = array("orange", "banana", "apple", "raspberry");
$last_fruit = array_pop($stack);
print_r($stack);
print_r('Last Fruit:'.$last_fruit); // Last element of the array

На выходе будет

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)
Last Fruit: raspberry

Удалить первый элемент (красный) из массива , - вернуть значение удаленного элемента

mixed array_shift ( array &$array )

$color = array("a" => "red", "b" => "green" , "c" => "blue");
$first_color = array_shift($color);
print_r ($color);
print_r ('First Color: '.$first_color);

Результат будет:

Array
(
    [b] => green
    [c] => blue
)
First Color: red
37
Peter Mortensen 25 Май 2016 в 21:16
1
array_shift повторно индексирует ключевые элементы, если это целое число, значит, это плохо, поэтому вы можете использовать это: stackoverflow.com/a / 52826684/1407491
 – 
Nabi K.A.Z.
16 Окт 2018 в 04:31
<?php
    $stack = ["fruit1", "fruit2", "fruit3", "fruit4"];
    $fruit = array_shift($stack);
    print_r($stack);

    echo $fruit;
?>

Выход:

[
    [0] => fruit2
    [1] => fruit3
    [2] => fruit4
]

fruit1
36
Neha Sharma 3 Сен 2019 в 05:54
15
Обратите внимание, что array_shift может удалить только первый элемент в массиве. аналогично используйте array_pop для удаления последнего элемента в массиве.
 – 
Jasir
22 Июл 2014 в 21:22
3
Ответ применим только к первому элементу массива и не отвечает на общий вопрос.
 – 
sweisgerber.dev
14 Окт 2014 в 15:03
Вы правы, но я не думаю, что это неправильно, и мне нужно проголосовать против этого ответа. Вопрос в том, чтобы удалить элемент, не упоминающий ни одной позиции.
 – 
Saurabh Chandra Patel
14 Окт 2014 в 16:13

Чтобы избежать поиска, можно поиграться с array_diff:

$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11

В этом случае не нужно искать / использовать ключ.

28
Mugoma J. Okomba 23 Сен 2016 в 01:10
Это будет работать, только если все элементы уникальны.
 – 
Jed Lynch
13 Окт 2020 в 17:40
// Remove by value
function removeFromArr($arr, $val)
{
    unset($arr[array_search($val, $arr)]);
    return array_values($arr);
}
18
GigolNet Guigolachvili 30 Июл 2018 в 15:54

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

class obj {
    protected $fields = array('field1','field2');
    protected $field1 = array();
    protected $field2 = array();
    protected loadfields(){}
    // This will load the $field1 and $field2 with rows of data for the column they describe
    protected function clearFields($num){
        foreach($fields as $field) {
            unset($this->$field[$num]);
            // This did not work the line below worked
            unset($this->{$field}[$num]); // You have to resolve $field first using {}
        }
    }
}

Вся цель $fields была проста, поэтому мне не нужно смотреть везде в коде, когда они меняются, я просто смотрю на начало класса и меняю список атрибутов и $ fields массив содержимого для отражения новых атрибутов.

10
Peter Mortensen 19 Фев 2019 в 13:59

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

if (($key = array_search('word', $array)) !== false) {
    unset($array[$key]);
}
10
user8031209user8031209 24 Фев 2019 в 14:19

Предположим, у вас есть следующий массив:

Array
(
    [user_id] => 193
    [storage] => 5
)

Чтобы удалить storage, выполните:

unset($attributes['storage']);
$attributes = array_filter($attributes);

И вы получите:

Array
(
    [user_id] => 193
)
9
Star 14 Фев 2019 в 09:15
Для чего используется array_filter?
 – 
David
17 Мар 2017 в 17:38
Удалить фальшивые элементы
 – 
Tebe
26 Июн 2017 в 15:13
<?php
    $array = array("your array");
    $array = array_diff($array, ["element you want to delete"]);
?>

Создайте свой массив в переменной $array, а затем там, где я поместил «элемент, который вы хотите удалить», вы помещаете что-то вроде: «a». А если вы хотите удалить несколько элементов, то: «a», «b».

9
Peter Mortensen 22 Фев 2019 в 13:02

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

Решение # 1

// 1 is the index of the first object to get
// NULL to get everything until the end
// true to preserve keys
$array = array_slice($array, 1, null, true);

Решение # 2

// Rewinds the array's internal pointer to the first element
// and returns the value of the first array element.
$value = reset($array);
// Returns the index element of the current array position
$key = key($array);
unset($array[$key]);

Для этого образца данных:

$array = array(10 => "a", 20 => "b", 30 => "c");

У вас должен быть такой результат:

array(2) {
  [20]=>
  string(1) "b"
  [30]=>
  string(1) "c"
}
9
Peter Mortensen 22 Фев 2019 в 13:14
<?php
    // If you want to remove a particular array element use this method
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");

    print_r($my_array);
    if (array_key_exists("key1", $my_array)) {
        unset($my_array['key1']);
        print_r($my_array);
    }
    else {
        echo "Key does not exist";
    }
?>

<?php
    //To remove first array element
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
    print_r($my_array);
    $new_array = array_slice($my_array, 1);
    print_r($new_array);
?>


<?php
    echo "<br/>    ";
    // To remove first array element to length
    // starts from first and remove two element
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
    print_r($my_array);
    $new_array = array_slice($my_array, 1, 2);
    print_r($new_array);
?>

Вывод

 Array ( [key1] => value 1 [key2] => value 2 [key3] =>
 value 3 ) Array (    [key2] => value 2 [key3] => value 3 )
 Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 )
 Array ( [key2] => value 2 [key3] => value 3 )
 Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 )
 Array ( [key2] => value 2 [key3] => value 3 )
6
Peter Mortensen 22 Фев 2019 в 12:53

Для ассоциативных массивов с нецелочисленными ключами:

Просто unset($array[$key]) подойдет.

Для массивов с целочисленными ключами и если вы хотите сохранить свои ключи:

  1. $array = [ 'mango', 'red', 'orange', 'grapes'];

    unset($array[2]);
    $array = array_values($array);
    
  2. array_splice($array, 2, 1);

6
Peter Mortensen 22 Фев 2019 в 13:12
$arrayName = array( '1' => 'somevalue',
                    '2' => 'somevalue1',
                    '3' => 'somevalue3',
                  );

print_r($arrayName[1]);
// somevalue
unset($arrayName[1]);

print_r($arrayName);
3
kyun 29 Май 2019 в 08:33

Это может помочь ...

<?php
    $a1 = array("a"=>"red", "b"=>"green", "c"=>"blue", "d"=>"yellow");
    $a2 = array("a"=>"purple", "b"=>"orange");
    array_splice($a1, 0, 2, $a2);
    print_r($a1);
?>

Результат будет:

Array ( [0] => purple [1] => orange [c] => blue [d] => yellow )
2
Peter Mortensen 22 Фев 2019 в 12:56

Если вам нужно удалить несколько элементов из ассоциативного массива, вы можете использовать array_diff_key ( ) (здесь используется с array_flip ()):

$my_array = array(
  "key1" => "value 1",
  "key2" => "value 2",
  "key3" => "value 3",
  "key4" => "value 4",
  "key5" => "value 5",
);

$to_remove = array("key2", "key4");

$result = array_diff_key($my_array, array_flip($to_remove));

print_r($result);

Выход:

Array ( [key1] => value 1 [key3] => value 3 [key5] => value 5 ) 
20
Simon 21 Апр 2016 в 00:05
Почему это так недооценивают?
 – 
Fr0zenFyr
2 Дек 2016 в 11:13

Используйте следующий код:

$arr = array('orange', 'banana', 'apple', 'raspberry');
$result = array_pop($arr);
print_r($result);
6
4 revs, 4 users 30% 19 Фев 2019 в 13:55
5
Php5: простой запуск array_pop($arr) удаляет последнюю запись. `=` Не требуется.
 – 
Chris K
16 Сен 2014 в 04:33