Удаление массива PHP по значению (не ключевое слово)
У меня есть массив PHP следующим образом:
$messages = [312, 401, 1599, 3, ...];
Я хочу удалить элемент, содержащий значение $del_val
(например, $del_val=401
), но я не знаю его ключа. Это может помочь: каждое значение может быть там только один раз.
Я ищу простейшую функцию для выполнения этой задачи, пожалуйста.
Ответы
Ответ 1
Используя array_search()
и unset
, попробуйте следующее:
if (($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
}
array_search()
возвращает ключ найденного элемента, который может быть использован для удаления этого элемента из исходного массива с помощью unset()
. Он вернет FALSE
при сбое, однако он может вернуть значение false-y при успешном завершении (например, ваш ключ может быть 0
), поэтому используется оператор строгого сравнения !==
.
Оператор if()
будет проверять, вернет ли значение array_search()
значение, и выполнит действие только в том случае, если оно было выполнено.
Ответ 2
Что ж, удаление элемента из массива в основном просто устанавливает разницу с одним элементом.
array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
Это хорошо обобщает, вы можете удалить столько элементов, сколько хотите одновременно, если хотите.
Отказ от ответственности: обратите внимание, что мое решение создает новую копию массива, сохраняя при этом старый нетронутым в отличие от принятого ответа, который изменяется. Выберите тот, который вам нужен.
Ответ 3
Один интересный способ - использовать array_keys()
:
foreach (array_keys($messages, 401, true) as $key) {
unset($messages[$key]);
}
Функция array_keys()
принимает два дополнительных параметра, чтобы возвращать только ключи для определенного значения и требуется ли строгая проверка (т.е. использование == = для сравнения).
Это также может удалить несколько элементов массива с тем же значением (например, [1, 2, 3, 3, 4]
).
Ответ 4
Если вы знаете, что ваш массив будет содержать только один элемент с этим значением, вы можете сделать
$key = array_search($del_val, $array);
if (false !== $key) {
unset($array[$key]);
}
Если, однако, ваше значение может произойти более одного раза в вашем массиве, вы можете сделать это
$array = array_filter($array, function($e) use ($del_val) {
return ($e !== $del_val);
});
Примечание. Второй вариант работает только для PHP5.3 + с Closures
Ответ 5
$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);
Ответ 6
Посмотрите на следующий код:
$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');
Вы можете сделать:
$arr = array_diff($arr, array('remove_me', 'remove_me_also'));
И это даст вам этот массив:
array('nice_item', 'another_liked_item')
Ответ 7
Лучший способ - array_splice
array_splice($array, array_search(58, $array ), 1);
Причина для лучшего находится здесь: http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/
Ответ 8
В следующем коде повторяющиеся значения будут удалены из сообщений $.
$messages = array_diff($messages, array(401));
Ответ 9
Или просто, ручной способ:
foreach ($array as $key => $value){
if ($value == $target_value) {
unset($array[$key]);
}
}
Это самый безопасный из них, потому что вы полностью контролируете свой массив
Ответ 10
function array_remove_by_value($array, $value)
{
return array_values(array_diff($array, array($value)));
}
$array = array(312, 401, 1599, 3);
$newarray = array_remove_by_value($array, 401);
print_r($newarray);
Выход
Array ( [0] => 312 [1] => 1599 [2] => 3 )
Ответ 11
Если у вас PHP 5.3+
, есть однострочный код:
$array = array_filter($array, function ($i) use ($value) { return $i !== $value; });
Ответ 12
ты можешь сделать:
unset($messages[array_flip($messages)['401']]);
Объяснение: Удалить элемент с ключом 401
после переворачивания массива.
Ответ 13
Чтобы удалить несколько значений, попробуйте следующее:
while (($key = array_search($del_val, $messages)) !== false)
{
unset($messages[$key]);
}
Ответ 14
Заимствовал логику underscore.JS _.reject и создал две функции (люди предпочитают функции !!)
array_reject_value: эта функция просто отклоняет указанное значение (также работает для PHP 4,5,7)
function array_reject_value(array &$arrayToFilter, $deleteValue) {
$filteredArray = array();
foreach ($arrayToFilter as $key => $value) {
if ($value !== $deleteValue) {
$filteredArray[] = $value;
}
}
return $filteredArray;
}
array_reject: эта функция просто отклоняет вызываемый метод (работает для PHP> = 5.3)
function array_reject(array &$arrayToFilter, callable $rejectCallback) {
$filteredArray = array();
foreach ($arrayToFilter as $key => $value) {
if (!$rejectCallback($value, $key)) {
$filteredArray[] = $value;
}
}
return $filteredArray;
}
Таким образом, в нашем текущем примере мы можем использовать вышеуказанные функции следующим образом:
$messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401);
или даже лучше: (так как это дает нам лучший синтаксис для использования, как у array_filter)
$messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
return $value === 401;
});
Выше можно использовать для более сложных вещей, таких как, скажем, мы хотели бы удалить все значения, которые больше или равны 401, мы могли бы просто сделать это:
$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
return $value >= $greaterOrEqualThan;
});
Ответ 15
Ответ @Bojangles помог мне. Спасибо.
В моем случае массив может быть ассоциативным или нет, поэтому я добавил следующую функцию
function test($value, $tab) {
if(($key = array_search($value, $tab)) !== false) {
unset($tab[$key]); return true;
} else if (array_key_exists($value, $tab)){
unset($tab[$value]); return true;
} else {
return false; // the $value is not in the array $tab
}
}
С уважением
Ответ 16
однострочный код (благодаря array_diff()), используйте следующее:
$messages = array_diff($messages, array(401));
Ответ 17
Получить ключ массива с помощью array_search()
.
Ответ 18
Если значения, которые вы хотите удалить, находятся или могут быть в массиве. Используйте функцию array_diff. Кажется, отлично работает для таких вещей.
array_diff
$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
Ответ 19
Я знаю, что это совсем не эффективно, но просто, интуитивно понятно и легко читается.
Так что, если кто-то ищет не очень интересное решение, которое можно расширить для работы с большим количеством значений или с более конкретными условиями... вот простой код:
$result = array();
$del_value = 401;
//$del_values = array(... all the values you don't wont);
foreach($arr as $key =>$value){
if ($value !== $del_value){
$result[$key] = $value;
}
//if(!in_array($value, $del_values)){
// $result[$key] = $value;
//}
//if($this->validete($value)){
// $result[$key] = $value;
//}
}
return $result
Ответ 20
Согласно вашему требованию " каждое значение может быть только один раз ", если вы просто заинтересованы в сохранении уникальных значений в вашем массиве, то array_unique()
может быть тем, что вы ищете.
Входные данные :
$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);
Результат:
array(2) {
[0] => int(4)
[2] => string(1) "3"
}
Ответ 21
Принятый ответ преобразует массив в ассоциативный массив, поэтому, если вы хотите сохранить его как неассоциативный массив с принятым ответом, вам, возможно, придется также использовать array_values
.
if(($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
$arr = array_values($messages);
}
Ссылка здесь
Ответ 22
Если вы не знаете его ключ, значит, он не имеет значения.
Вы можете поместить значение в качестве ключа, это означает, что оно мгновенно найдет значение. Лучше, чем использовать поиск по всем элементам снова и снова.
$messages=array();
$messages[312] = 312;
$messages[401] = 401;
$messages[1599] = 1599;
$messages[3] = 3;
unset($messages[3]); // no search needed
Ответ 23
Однострочное использование оператора or
:
($key = array_search($del_val, $messages)) !== false or unset($messages[$key]);
Ответ 24
Вы можете сослаться на этот URL: для функции
array-diff-key()
<?php
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);
var_dump(array_diff_key($array1, $array2));
?>
Тогда вывод должен быть,
array(2) {
["red"]=>
int(2)
["purple"]=>
int(4)
}
Ответ 25
Еще одна идея, чтобы удалить значение массива, использовать array_diff. Если я захочу
$my_array = array(1=>"a", "second_value"=>"b", 3=>"c", "d");
$new_array_without_value_c = array_diff($my_array, array("c"));
(Документ: http://php.net/manual/fr/function.array-diff.php)