Есть ли простой способ удалить элемент из массива с помощью PHP, чтобы foreach ($array) больше не включал этот элемент?
Я думал, что установка null сделает это, но, видимо, это не работает.
@danip Легкость поиска в руководстве не исключает вопроса о StackOverflow. Если бы вопрос был вопросом дублировать StackOverflow, он мог бы здесь не подходить. StackOverflow - хорошее место, где можно найти ответы еще до того, как заглянуть в руководство.
@unset ($ array [$ key]); $ array = array_values ($ массив);
Связанный вопрос об удалении этого в цикле foreach: stackoverflow.com/questions/1949259/…
Если вы хотите удалить ключи из массива массива (ассоциативный массив), см. Решение на stackoverflow.com/a/47978980/1045444
вы можете сделать это в цикле foreach следующим образом: pastefs.com/pid/130950
Установка нулевого значения ключа массива простыми средствами включает ключ, имеющий нулевое значение. Ключ все еще существует.
@Aurangzeb, код работает нормально (должен быть ответ, и я бы поддержал его за его простоту).






Существуют разные способы удаления элемента массива, некоторые из которых более полезны для некоторых конкретных задач, чем другие.
Если вы хотите удалить только один элемент массива, вы можете использовать unset() или, альтернативно, \array_splice().
Если вы знаете значение и не знаете ключ для удаления элемента, вы можете использовать \array_search(), чтобы получить ключ. Это работает, только если элемент встречается не более одного раза, поскольку \array_search возвращает только первое совпадение.
unset()Обратите внимание, что при использовании unset() ключи массива не изменятся. Если вы хотите переиндексировать ключи, вы можете использовать \array_values() после unset(), который преобразует все ключи в ключи с числовой нумерацией, начиная с 0.
Код:
$array = [0 => "a", 1 => "b", 2 => "c"];
unset($array[1]);
// ↑ Key which you want to delete
Выход:
[
[0] => a
[2] => c
]
\array_splice() методЕсли вы используете \array_splice(), ключи будут автоматически переиндексированы, но ассоциативные ключи не изменятся - в отличие от \array_values(), который преобразует все ключи в цифровые.
\array_splice() нуждается в компенсировать, а не в ключ, в качестве второго параметра.
Код:
$array = [0 => "a", 1 => "b", 2 => "c"];
\array_splice($array, 1, 1);
// ↑ Offset which you want to delete
Выход:
[
[0] => a
[1] => c
]
array_splice(), как и unset(), берем массив по ссылке. Вы не присваиваете возвращаемые значения этих функций массиву.
Если вы хотите удалить несколько элементов массива и не хотите вызывать unset() или \array_splice() несколько раз, вы можете использовать функции \array_diff() или \array_diff_key() в зависимости от того, знаете ли вы значения или ключи элементов, которые вы хотите удалить.
\array_diff() методЕсли вам известны значения элементов массива, которые вы хотите удалить, вы можете использовать \array_diff(). Как и раньше с unset(), он не изменит ключи массива.
Код:
$array = [0 => "a", 1 => "b", 2 => "c", 3 => "c"];
$array = \array_diff($array, ["a", "c"]);
// └────────┘
// Array values which you want to delete
Выход:
[
[1] => b
]
\array_diff_key() методЕсли вы знаете ключи элементов, которые хотите удалить, то вы хотите использовать \array_diff_key(). Вы должны убедиться, что вы передаете ключи как ключи во втором параметре, а не как значения. Ключи не индексируются.
Код:
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
// ↑ ↑
// Array keys which you want to delete
Выход:
[
[1] => b
]
Если вы хотите использовать unset() или \array_splice() для удаления нескольких элементов с одинаковым значением, вы можете использовать \array_keys(), чтобы получить все ключи для определенного значения, а затем удалить все элементы.
если у вас есть <? php $ x = array (1, 2, 3, 4); не задано ($ x [2]); var_dump ($ x); // массив (3) {[0] => int (0), [1] => int (2), [3] => int (4),}?>
@AlexandruRada Нет, вы сказали: «Не используйте это» - и это полная чушь. Вы можете безопасно использовать этот метод, когда рассматриваете массив как то, что он есть - словарь. Только если вы ожидаете последовательных числовых индексов, вам нужно использовать что-то еще.
@Alexander Используйте array_splice, как описано в других ответах.
@AlexandruRada Невозможно получить array (3) { [0]=>int(0) ..., если у вас unset($x[2]) от $x = array(1, 2, 3, 4); Результат должен будет var_dump($x); // array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) } (вероятно, это была опечатка)
unset может иметь несколько аргументов: void unset ( mixed $var [, mixed $... ] ).
array_filter также является жизнеспособным методом. Особенно хорошо, если вы не хотите изменять массив, но он также не переиндексирует, что может быть проблемой с json_encode. php.net/manual/en/function.json-encode.php#94157
В array_splice и других кодах необходимо знать имя ключа или значений массива, и поэтому некоторое время переиндексировать массив ключей для удаления первого элемента с сохранением порядка индекса, и если элемент индекса не известен, можно использовать этот метод: stackoverflow.com/a/52826684/1407491
Есть ли способ удалить элемент массива из многомерного (ключ, значение) массива.
Для удаления нескольких элементов или возврата многомерных массивов array_map может быть полезным дополнением.
unset - это не функция, а языковая конструкция (и ключевое слово). Он не должен и не может начинаться с префикса ``
@hvertous Спасибо, замечательно! Исправил сейчас.
@ShivamSharma Я откатил ваше редактирование - array_values уже упоминался, и ваше редактирование, таким образом, значительно увеличивало и без того длинный ответ без добавления новой информации.
@ АртемНосов Пожалуйста, не удаляйте обратную косую черту, они есть не просто так.
Это неверный ответ. Ключи в массиве по определению имеют уникальное ограничение, а элементы - нет. Такие функции, как array_flip () и array_search () не дадут вам правильных результатов, если несколько элементов совпадают.
@JedLynch Ответ уже касается этого случая (в частности, последнего абзаца). Но я сделал пример более понятным, и я также удалил ссылку на array_flip, которая, я согласен, здесь неуместна.
unset($array[$index]);
Следует отметить, что 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)
} */
Стоит отметить, что когда вы используете array_splice (), вам нужно знать OFFSET, а не ключ, а смещение (!) Любого элемента, который вы хотите удалить.
@Tom: для обычного массива (с непрерывным целочисленным индексом) смещение - это индекс. Вот где array_splice может иметь смысл (среди прочего).
Да, конечно, но просто кое-что нужно запомнить, если вы вмешаетесь в массив перед использованием сплайсинга.
Остается один вопрос (и на него будет здорово получить здесь ответ): какой из них лучше с точки зрения производительности?.
После простого теста на удаление тонны элементов из гигантского массива array_splice кажется намного быстрее и требует меньше памяти. Это соответствует тому, что я ожидал: похоже, что array_values () создает копию массива, а array_splice работает на месте.
array_values - полезный подход, когда вы удаляете элементы в цикле и хотите, чтобы индексы были согласованными, но затем хотите сжать их после цикла.
Думаю, выборка массива была выбрана неразумно, так как ключи равны значениям
имеет смысл, что array_splice работает быстрее или эффективнее, поскольку для «выбора» удаляемых элементов требуется смещение, а не индекс. Прогулка на основе смещений, а не индексов избавляет вас от чтения индекса каждого элемента
Array_splice будет работать только для числовых массивов, поэтому array_slice - не лучший ответ.
Также для именованного элемента:
unset($array["elementName"]);
$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 )Кажется, вы не можете сбросить элементы массива, проиндексированные строкой (генерирует «Неустранимая ошибка: невозможно сбросить смещения строки»). Я не думаю, что так было всегда, но, конечно, начиная с PHP 5.3.10 и, вероятно, раньше
@carpii PHP может удалять элементы из ассоциативного массива. Фатальная ошибка возникает, когда вы пытаетесь использовать unset ($ var ['key']) в строке вместо массива. Например: $ array = array ('test' => 'value', 'another' => ' значение', ); unset ($ array ['test']); // Удаляет элемент "test" из массива, как ожидалось $ array = 'test'; unset ($ array ['test']); // Выдает «Неустранимая ошибка: невозможно отменить смещение строки», как ожидалось
Здесь вы должны знать название ключа, лучше: stackoverflow.com/a/52826684/1407491
// Our initial array
$arr = array("blue", "green", "red", "yellow", "green", "orange", "yellow", "indigo", "red");
print_r($arr);
// Remove the elements who's values are yellow or red
$arr = array_diff($arr, array("yellow", "red"));
print_r($arr);
Это результат приведенного выше кода:
Array
(
[0] => blue
[1] => green
[2] => red
[3] => yellow
[4] => green
[5] => orange
[6] => yellow
[7] => indigo
[8] => red
)
Array
(
[0] => blue
[1] => green
[4] => green
[5] => orange
[7] => indigo
)
Теперь array_values () красиво переиндексирует числовой массив, но удалит все ключевые строки из массива и заменит их числами. Если вам нужно сохранить имена ключей (строки) или переиндексировать массив, если все ключи числовые, используйте array_merge ():
$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);
Выходы
Array
(
[0] => blue
[1] => green
[2] => green
[3] => orange
[4] => indigo
)
$ get_merged_values = array_merge ($ data ['res'], $ data ['check_res']); когда я печатаю этот print_r ($ get_merged_values); он отображает следующее. Массив ([0] => Массив ([menu_code] => 2 [menu_name] => Завод [menu_order_no] => 1) [1] => Массив ([menu_code] => 3 [menu_name] => Строка [menu_order_no] » => 2)) Но мне нужно получить значения menu_code и menu_name, используя $ get_merged_values ['menu_code'] и $ get_merged_values ['menu_name'] соответственно, вместо использования $ get_merged_values [0] [menu_code], $ get_merged_values [0 ] [имя_меню]. пожалуйста, помогите мне, как это сделать?
Формулировка вопроса вводит в заблуждение по сравнению с тем, как он сформулирован. Это не сработает, если вы хотите удалить $ arr [$ i] в цикле foreach, если несколько элементов имеют одинаковое значение.
$key = array_search($needle, $array);
if ($key !== false) {
unset($array[$key]);
}
Было бы хорошо уточнить, что этот ответ предназначен для удаления элемента, когда вы знаете значение, но не ключ. Обратите внимание, что он удаляет только ПЕРВЫЙ экземпляр значения; чтобы найти ключи все для значения, используйте array_keys
Если несколько элементов имеют одинаковое значение, это не сработает.
Если у вас есть массив с числовым индексом, в котором все значения уникальны (или они не уникальны, но вы хотите удалить все экземпляры определенного значения), вы можете просто использовать 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 после удаления.
Если два элемента имеют одинаковое значение, это не сработает.
Используйте следующий код:
$arr = array('orange', 'banana', 'apple', 'raspberry');
$result = array_pop($arr);
print_r($result);
php5: простой запуск array_pop($arr) удаляет последнюю запись. `=` Не требуется.
<?php
$stack = ["fruit1", "fruit2", "fruit3", "fruit4"];
$fruit = array_shift($stack);
print_r($stack);
echo $fruit;
?>
Выход:
[
[0] => fruit2
[1] => fruit3
[2] => fruit4
]
fruit1
Обратите внимание, что array_shift может удалить только первый элемент в массиве. аналогично используйте array_pop для удаления последнего элемента в массиве.
Ответ применим только к первому элементу массива и не отвечает на общий вопрос.
@sebweisgerber, вы правы, но я не думаю, что это неправильный ответ, и вам нужно проголосовать против этого ответа. Вопрос в том, чтобы удалить элемент, не упоминающий ни одной позиции.
Это касается только одного крайнего случая
unset() уничтожает указанные переменные.
Поведение unset() внутри функции может варьироваться в зависимости от типа переменной, которую вы пытаетесь уничтожить.
Если глобальная переменная unset() внутри функции, уничтожается только локальная переменная. Переменная в вызывающей среде сохранит то же значение, что и до вызова unset().
<?php
function destroy_foo()
{
global $foo;
unset($foo);
}
$foo = 'bar';
destroy_foo();
echo $foo;
?>
Ответ приведенного выше кода будет бар.
Для unset() глобальная переменная внутри функции:
<?php
function foo()
{
unset($GLOBALS['bar']);
}
$bar = "something";
foo();
?>
Я просто хотел бы сказать, что у меня был конкретный объект с переменными атрибутами (он в основном отображал таблицу, и я менял столбцы в таблице, поэтому атрибуты в объекте, отражающие таблицу, также будут различаться):
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, чтобы отразить новый атрибуты.
Предположим, у вас есть следующий массив:
Array
(
[user_id] => 193
[storage] => 5
)
Чтобы удалить storage, выполните:
unset($attributes['storage']);
$attributes = array_filter($attributes);
И вы получите:
Array
(
[user_id] => 193
)
Для чего используется array_filter?
удалить фальшивые элементы
Уничтожить отдельный элемент массива
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
array_shift повторно индексирует ключевые элементы, если он целочислен, поэтому это плохо, поэтому вы можете использовать это: stackoverflow.com/a/52826684/1407491
Следуйте функциям по умолчанию:
unset() уничтожает указанные переменные. Для получения дополнительной информации вы можете обратиться к PHP не установлен
$Array = array("test1", "test2", "test3", "test3");
unset($Array[2]);
Функция array_pop() удаляет последний элемент массива. Для получения дополнительной информации вы можете обратиться к PHP array_pop
$Array = array("test1", "test2", "test3", "test3");
array_pop($Array);
Функция array_splice() удаляет выбранные элементы из массива и заменяет их новыми элементами. Для получения дополнительной информации вы можете обратиться к PHP array_splice
$Array = array("test1", "test2", "test3", "test3");
array_splice($Array,1,2);
Функция array_shift() удаляет первый элемент из массива. Для получения дополнительной информации вы можете обратиться к PHP array_shift
$Array = array("test1", "test2", "test3", "test3");
array_shift($Array);
Если вам нужно удалить несколько значений в массиве, а записи в этом массиве являются объектами или структурированными данными, лучше всего подойдет [array_filter][1]. Те записи, которые возвращают истину из функции обратного вызова, будут сохранены.
$array = [
['x'=>1,'y'=>2,'z'=>3],
['x'=>2,'y'=>4,'z'=>6],
['x'=>3,'y'=>6,'z'=>9]
];
$results = array_filter($array, function($value) {
return $value['x'] > 2;
}); //=> [['x'=>3,'y'=>6,z=>'9']]
Для ассоциативных массивов используйте unset:
$arr = array('a' => 1, 'b' => 2, 'c' => 3);
unset($arr['b']);
// RESULT: array('a' => 1, 'c' => 3)
Для числовых массивов используйте array_splice:
$arr = array(1, 2, 3);
array_splice($arr, 1, 1);
// RESULT: array(0 => 1, 1 => 3)
Использование unset для числовых массивов не приведет к ошибке, но испортит ваши индексы:
$arr = array(1, 2, 3);
unset($arr[1]);
// RESULT: array(0 => 1, 2 => 3)
// Remove by value
function removeFromArr($arr, $val)
{
unset($arr[array_search($val, $arr)]);
return array_values($arr);
}
Если вам нужно удалить несколько элементов из ассоциативного массива, вы можете использовать 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 )
Почему это так недооценивают?
<?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 )
Это может помочь ...
<?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 )
Чтобы избежать поиска, можно поиграться с array_diff:
$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11
В этом случае не нужно искать / использовать ключ.
Это будет работать, только если все элементы уникальны.
Для тех из вас, кто ищет эквивалент Ruby hash#delete на PHP:
<?php
function array_delete(&$array, $key) {
if (!isset($array[$key])) {
return null;
}
$value = $array[$key];
unset($array[$key]);
return $value;
}
Это не только удалит элемент из вашего массива, но также вернет значение, хранящееся в этом ключе, чтобы вы могли использовать свой массив нелинейным образом.
Добавил это, потому что так я попал сюда из Google
Несмотря на то, что за него много проголосовали против, я оставлю его здесь, потому что он важен для меньшинства в сообществе.
Используйте функцию unset, как показано ниже:
$a = array(
'salam',
'10',
1
);
unset($a[1]);
print_r($a);
/*
Output:
Array
(
[0] => salam
[2] => 1
)
*/
Используйте функцию array_search, чтобы получить ключ элемента, и используйте описанный выше способ для удаления элемента массива, как показано ниже:
$a = array(
'salam',
'10',
1
);
$key = array_search(10, $a);
if ($key !== false) {
unset($a[$key]);
}
print_r($a);
/*
Output:
Array
(
[0] => salam
[2] => 1
)
*/
Вы можете просто использовать unset() для удаления массива.
Помните, что массив должен быть сброшен после функции foreach.
<?php
$array = array("your array");
$array = array_diff($array, ["element you want to delete"]);
?>
Создайте свой массив в переменной $array, а затем там, где я поместил «элемент, который вы хотите удалить», вы помещаете что-то вроде: «a». А если вы хотите удалить несколько элементов, то: «a», «b».
Хотя unset() упоминался здесь несколько раз, еще не упоминалось, что unset() принимает несколько переменных, что упрощает удаление нескольких несмежных элементов из массива за одну операцию:
// Delete multiple, noncontiguous elements from an array
$array = [ 'foo', 'bar', 'baz', 'quz' ];
unset( $array[2], $array[3] );
print_r($array);
// Output: [ 'foo', 'bar' ]
unset () не принимает массив ключей для удаления, поэтому приведенный ниже код завершится ошибкой (хотя это немного упростило бы динамическое использование unset ()).
$array = range(0,5);
$remove = [1,2];
$array = unset( $remove ); // FAILS: "unexpected 'unset'"
print_r($array);
Вместо этого unset () можно динамически использовать в цикле foreach:
$array = range(0,5);
$remove = [1,2];
foreach ($remove as $k=>$v) {
unset($array[$v]);
}
print_r($array);
// Output: [ 0, 3, 4, 5 ]
Есть еще одна практика, о которой еще не упоминалось. Иногда самый простой способ избавиться от определенных ключей массива - просто скопировать $ array1 в $ array2.
$array1 = range(1,10);
foreach ($array1 as $v) {
// Remove all even integers from the array
if ( $v % 2 ) {
$array2[] = $v;
}
}
print_r($array2);
// Output: [ 1, 3, 5, 7, 9 ];
Очевидно, такая же практика применяется к текстовым строкам:
$array1 = [ 'foo', '_bar', 'baz' ];
foreach ($array1 as $v) {
// Remove all strings beginning with underscore
if ( strpos($v,'_')===false ) {
$array2[] = $v;
}
}
print_r($array2);
// Output: [ 'foo', 'baz' ]
Решения:
unset($array[3]); unset($array['foo']);
unset($array[3], $array[5]); unset($array['foo'], $array['bar']);
array_splice($array, $offset, $length);
Дальнейшее объяснение:
Использование этих функций удаляет все ссылки на эти элементы из PHP. Если вы хотите сохранить ключ в массиве, но с пустым значением, присвойте элементу пустую строку:
$array[3] = $array['foo'] = '';
Помимо синтаксиса, существует логическая разница между использованием unset () и присвоением "" элементу. Первый говорит This doesn't exist anymore,, а второй говорит This still exists, but its value is the empty string.
Если вы имеете дело с числами, присвоение 0 может быть лучшей альтернативой. Таким образом, если компания прекратит производство звездочки модели XL1000, она обновит свой инвентарь, добавив:
unset($products['XL1000']);
Однако, если у него временно закончились звездочки XL1000, но он планировал получить новую партию с завода позже на этой неделе, лучше:
$products['XL1000'] = 0;
Если вы unset () элемент, PHP настраивает массив так, чтобы цикл по-прежнему работал правильно. Он не сжимает массив, чтобы заполнить недостающие дыры. Это то, что мы имеем в виду, когда говорим, что все массивы ассоциативны, даже если они кажутся числовыми. Вот пример:
// Create a "numeric" array
$animals = array('ant', 'bee', 'cat', 'dog', 'elk', 'fox');
print $animals[1]; // Prints 'bee'
print $animals[2]; // Prints 'cat'
count($animals); // Returns 6
// unset()
unset($animals[1]); // Removes element $animals[1] = 'bee'
print $animals[1]; // Prints '' and throws an E_NOTICE error
print $animals[2]; // Still prints 'cat'
count($animals); // Returns 5, even though $array[5] is 'fox'
// Add a new element
$animals[ ] = 'gnu'; // Add a new element (not Unix)
print $animals[1]; // Prints '', still empty
print $animals[6]; // Prints 'gnu', this is where 'gnu' ended up
count($animals); // Returns 6
// Assign ''
$animals[2] = ''; // Zero out value
print $animals[2]; // Prints ''
count($animals); // Returns 6, count does not decrease
Чтобы сжать массив в плотно заполненный числовой массив, используйте array_values ():
$animals = array_values($animals);
В качестве альтернативы array_splice () автоматически переиндексирует массивы, чтобы не оставлять дыр:
// Create a "numeric" array
$animals = array('ant', 'bee', 'cat', 'dog', 'elk', 'fox');
array_splice($animals, 2, 2);
print_r($animals);
Array
(
[0] => ant
[1] => bee
[2] => elk
[3] => fox
)
Это полезно, если вы используете массив в качестве очереди и хотите удалить элементы из очереди, сохраняя при этом произвольный доступ. Чтобы безопасно удалить первый или последний элемент из массива, используйте array_shift () и array_pop () соответственно.
unset не меняет индекс, но array_splice:
$arrayName = array('1' => 'somevalue',
'2' => 'somevalue1',
'3' => 'somevalue3',
500 => 'somevalue500',
);
echo $arrayName['500'];
//somevalue500
array_splice($arrayName, 1, 2);
print_r($arrayName);
//Array ( [0] => somevalue [1] => somevalue500 )
$arrayName = array( '1' => 'somevalue',
'2' => 'somevalue1',
'3' => 'somevalue3',
500 => 'somevalue500',
);
echo $arrayName['500'];
//somevalue500
unset($arrayName[1]);
print_r($arrayName);
//Array ( [0] => somevalue [1] => somevalue500 )
$x = array(1, 2, 3, 4, 5);
var_dump($x);
unset($x[3]); // Here is the key to be deleted
echo '<br>';
array_values($x);
var_dump($x);
Пятая строка должна быть $x = array_values($x);.
Вы можете использовать метод array_pop для удаления последнего элемента массива:
<?php
$a = array("one", "two", "Three");
array_pop($a);
print_r($a);
?>
The out put will be
Array ( [0] => one[1] => two)
который удаляет только последний элемент операции LIFO массива
Есть два метода для выполнения этой задачи: unset () и array_splice ().
Допустим, два массива:
$array_1 = array('a'=>'One', 'b'=>'Two', 'c'=>'Three');
$array_2 = array('Red', 'Yellow', 'White', 'Black', 'Green');
С неустановленным ()
syntax - unset(array_element)
unset($array_1['a']); // Any valid key
unset($array_2[0]); // Any valid index
С array_splice ()
syntax - array_splice(array, index, length)
array_splice($array_1, 1, 1); // Remove one element from $array_1 from index 1
array_splice($array_2, 3, 1); // Remove one element from $array_2 from index 3
Для ассоциативных массивов с нецелочисленными ключами:
Просто unset($array[$key]) подойдет.
Для массивов с целочисленными ключами и если вы хотите сохранить свои ключи:
$array = [ 'mango', 'red', 'orange', 'grapes'];
unset($array[2]);
$array = array_values($array);
array_splice($array, 2, 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);
// 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"
}
Используйте array_search, чтобы получить ключ, и удалите его с неустановленным, если он найден:
if (($key = array_search('word', $array)) !== false) {
unset($array[$key]);
}
Если указан индекс:
$arr = ['a', 'b', 'c'];
$index = 0;
unset($arr[$index]); // $arr = ['b', 'c']
Если индекс НЕ указан:
$arr = ['a', 'b', 'c'];
$index = array_search('a', $arr); // search the value to find index
if ($index !== false){
unset($arr[$index]); // $arr = ['b', 'c']
}
Необходимо условие if
потому что, если index не найден, unset() автоматически удалит
первый элемент массива, который нам не нужен.
$arrayName = array( '1' => 'somevalue',
'2' => 'somevalue1',
'3' => 'somevalue3',
);
print_r($arrayName[1]);
// somevalue
unset($arrayName[1]);
print_r($arrayName);
если вы хотите удалить определенный объект массива по ссылке на этот объект, вы можете сделать следующее:
unset($array[array_search($object,$array)]);
Пример:
<?php
class Foo
{
public $id;
public $name;
}
$foo1 = new Foo();
$foo1->id = 1;
$foo1->name = 'Name1';
$foo2 = new Foo();
$foo2->id = 2;
$foo2->name = 'Name2';
$foo3 = new Foo();
$foo3->id = 3;
$foo3->name = 'Name3';
$array = array($foo1,$foo2,$foo3);
unset($array[array_search($foo2,$array)]);
echo '<pre>';
var_dump($array);
echo '</pre>';
?>
Результат:
array(2) {
[0]=>
object(Foo)#1 (2) {
["id"]=>
int(1)
["name"]=>
string(5) "Name1"
}
[2]=>
object(Foo)#3 (2) {
["id"]=>
int(3)
["name"]=>
string(5) "Name3"
}
}
Обратите внимание, что если объект встречается несколько раз, он будет удален только при первом появлении!
Используйте unset для удаления ключа Street:
<?php
$arr1 = array("Name" => "Johm", "Street" => "Waall", "Country" => "India");
unset($arr1["Street"]);
?>
РЕЗУЛЬТАТ:
array("Name" => "Johm","Country" => "India")`
Это не приведет к повторной индексации массива после удаления значения, поэтому используйте array_splice();.
Если вы работаете в REST API, используйте unset
Я пришел сюда, потому что хотел увидеть, есть ли более элегантное решение этой проблемы, чем использование unset ($ arr [$ i]). К моему разочарованию, эти ответы либо неверны, либо не охватывают все крайние случаи.
Вот почему array_diff () не работает. Ключи в массиве уникальны, а элементы не всегда уникальны.
$arr = [1,2,2,3];
foreach($arr as $i => $n){
$b = array_diff($arr,[$n]);
echo "\n".json_encode($b);
}
Полученные результаты...
[2,2,3]
[1,3]
[1,2,2]
Если два элемента совпадают, они будут удалены. Это также относится к array_search () и array_flip ().
Я видел много ответов с array_slice () и array_splice (), но эти функции работают только с числовыми массивами. Все ответы я знаю, если здесь нет ответа на вопрос, и поэтому вот решение, которое будет работать.
$arr = [1,2,3];
foreach($arr as $i => $n){
$b = array_merge(array_slice($arr,0,$i),array_slice($arr,$i+1));
echo "\n".json_encode($b);
}
Results...
[2,3];
[1,3];
[1,2];
Поскольку unset ($ arr [$ i]) будет работать как с ассоциативными массивами, так и с числовыми массивами, это все еще не отвечает на вопрос.
Это решение заключается в сравнении ключей и с помощью инструмента, который будет обрабатывать как числовые, так и ассоциативные массивы. Для этого я использую array_diff_uassoc (). Эта функция сравнивает ключи в функции обратного вызова.
$arr = [1,2,2,3];
//$arr = ['a'=>'z','b'=>'y','c'=>'x','d'=>'w'];
foreach($arr as $key => $n){
$b = array_diff_uassoc($arr, [$key=>$n], function($a,$b) {
if ($a != $b){
return 1;
}
});
echo "\n".json_encode($b);
}
Полученные результаты.....
[2,2,3];
[1,2,3];
[1,2,2];
['b'=>'y','c'=>'x','d'=>'w'];
['a'=>'z','c'=>'x','d'=>'w'];
['a'=>'z','b'=>'y','d'=>'w'];
['a'=>'z','b'=>'y','c'=>'x'];
Это очень хороший способ сделать это. Получил урок сегодня.
Я бы не стал, чтобы ответ Конрада был самым простым на поставленную проблему. С
unset()итерации по массиву больше не будут включать удаленное значение. OTOH, это правда, что Стеван ответил достаточно, и, на самом деле, это был ответ, который я искал, но не OP :)