У меня есть массив 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, однако в случае успеха может вернуть ложное значение (например, ваш ключ может быть равен 0), поэтому используется оператор строгого сравнения «!==». Оператор if() проверяет, вернула ли array_search() значение, и выполняет действие только в том случае, если это так.
Ответ 2
Ну, удаление элемента из массива — это, по сути, просто разность множеств с одним элементом.
array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
Он хорошо обобщается, вы можете удалить столько элементов одновременно, сколько захотите.
Обратите внимание, что мое решение создает новую копию массива, сохраняя старую, в отличие от принятого ответа.
Ответ 3
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 )
Ответ 4
Здесь мы позаимствовали логику underscore.JS _.reject и создали две функции.
array_reject_value: Эта функция просто отклоняет указанное значение (также работает для PHP4,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;
});
Ответ 5
Я знаю, что это совсем не эффективно, но это просто, интуитивно понятно и легко читается. Так что, если кто-то ищет не слишком причудливое решение, которое можно расширить для работы с большим количеством значений или более специфическими условиями... вот простой код:
$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;
Ответ 6
Я думаю, что самым простым способом будет использование функции с циклом foreach:
//Эта функция удаляет элементы массива $original, которые эквивалентны значению $del_val
//Функция работает по ссылке, что означает, что фактический массив, используемый в качестве параметра, будет изменен.
function delete_value(&$original, $del_val) {
//создаем копию оригинала, чтобы избежать проблем с изменением массива, по которому в данный момент идет итерация
$copy = $original;
foreach ($original as $key => $value) {
//для каждого значения оценить, эквивалентно ли оно удаляемому, и если да, то захватить его ключевое имя.
if($del_val === $value) $del_key[] = $key;
};
//Если значение было найдено, удалите все его экземпляры
if($del_key !== null) {
foreach ($del_key as $dk_i) {
unset($original[$dk_i]);
};
//опциональное переупорядочивание ключей. ВНИМАНИЕ: используйте его только с массивами с числовыми индексами!
/*
$copy = $original;
$original = array();
foreach ($copy as $value) {
$original[] = $value;
};
*/
//значение было найдено и удалено
return true;
};
//Значение не было найдено, ничего не было удалено
return false;
};
$original = array(0,1,2,3,4,5,6,7,4);
$del_val = 4;
var_dump($original);
delete_value($original, $del_val);
var_dump($original);
Вывод будет таким:
array(9) {
[0] => int(0)
[1] => int(1)
[2] => int(2)
[3] => nt(3)
[4] => int(4)
[5] => int(5)
[6] => int(6)
[7] => int(7)
[8] => int(4)
}
array(7) {
[0] => int(0)
[1] => int(1)
[2] => int(2)
[3] => int(3)
[5] => int(5)
[6] => int(6)
[7] => int(7)
}
Ответ 7
Вот одно простое, но понятное решение:
$messagesFiltered = [];
foreach ($messages as $message) {
if (401 != $message) {
$messagesFiltered[] = $message;
}
}
$messages = $messagesFiltered;
Web