Массив PHP удалить по значению (не ключу)


У меня есть массив PHP следующим образом:

$messages = [312, 401, 1599, 3, ...];

Я хочу удалить элемент, содержащий значение $del_val (например, $del_val=401), но я не знаю его ключа. Это может помочь: каждое значение может быть там только один раз.

Я ищу простейшую функцию для выполнения этой задачи, пожалуйста.

 689
Author: Rok Kralj, 2011-08-29

25 answers

Использование array_search() и unset, попробуйте выполнить следующее:

if (($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
}

array_search() возвращает ключ найденного элемента, который можно использовать для удаления этого элемента из исходного массива с помощью unset(). Он вернет FALSE при сбое, однако при успешном выполнении может вернуть значение false-y (например, ваш ключ может быть 0), поэтому используется оператор строгого сравнения !==.

Оператор if() проверит, вернул ли array_search() значение, и будет только выполните действие, если оно было выполнено.

 1271
Author: Bojangles, 2017-10-18 10:42:30

Ну, удаление элемента из массива в основном просто устанавливает разницу с одним элементом.

array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]

Это хорошо обобщает, вы можете удалить столько элементов, сколько захотите, одновременно, если хотите.

Отказ от ответственности: Обратите внимание, что мое решение создает новую копию массива, сохраняя при этом старую нетронутой, в отличие от принятого ответа, который мутирует. Из-за этого это может быть немного медленнее.

 492
Author: Rok Kralj, 2018-02-25 10:16:37

Один интересный способ заключается в использовании array_keys():

foreach (array_keys($messages, 401, true) as $key) {
    unset($messages[$key]);
}

В array_keys() функция принимает два дополнительных параметра, чтобы возвращать только ключи для определенного значения и требуется ли строгая проверка (т. Е. Использование === для сравнения).

Это также может удалить несколько элементов массива с одинаковым значением (например, [1, 2, 3, 3, 4]).

 98
Author: Ja͢ck, 2014-01-14 06:48:23

Если вы точно знаете, что ваш массив будет содержать только один элемент с этим значением, вы можете сделать

$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+ с закрытиями

 44
Author: adlawson, 2014-08-08 02:58:46
$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);
 36
Author: Rmannn, 2012-08-01 17:26:59

Взгляните на следующий код:

$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')
 23
Author: theCodeMachine, 2013-03-16 12:47:15

С помощью следующего кода повторяющиеся значения будут удалены из сообщений $.

$messages = array_diff($messages, array(401));

 19
Author: Syed Abidur Rahman, 2014-01-02 03:33:42

Лучший способ - это 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/

 19
Author: Abdul Jabbar Dumrai, 2017-01-26 06:17:19

Или просто, вручную:

foreach ($array as $key => $value){
    if ($value == $target_value) {
        unset($array[$key]);
    }
}

Это самый безопасный из них, потому что у вас есть полный контроль над вашим массивом

 16
Author: Victor Priceputu, 2015-09-22 19:03:32
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 )

 10
Author: tttony, 2011-08-29 02:19:07

Чтобы удалить несколько значений, попробуйте это

while (($key = array_search($del_val, $messages)) !== false) 
{
    unset($messages[$key]);
}
 8
Author: Rajendra Khabiya, 2015-01-15 06:47:25

Вы можете сделать:

unset($messages[array_flip($messages)['401']]);

Объяснение: Удалите элемент, у которого есть ключ 401, после переворачивания массива.

 8
Author: Qurashi, 2015-04-09 08:50:06

Если у вас есть >php5.3, есть код в одну строку:

$array = array_filter($array, function($i) use ($value){return $i != $value;}); 
 8
Author: David Lin, 2016-10-05 04:34:34

Позаимствовал логику underscoreJS _.отклонить и создал две функции (люди предпочитают функции!!)

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;
});
 6
Author: John Skoumbourdis, 2016-10-24 19:18:17

@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
 }

}

С уважением

 5
Author: angeltcho, 2014-03-04 11:32:05

Получите ключ с помощью array_search().

 4
Author: evan, 2011-08-29 00:47:09

Если ваши значения, которые вы хотите удалить, находятся или могут находиться в массиве. Используйте функцию array_diff. Кажется, отлично подходит для таких вещей, как это.

Массив_дифф

$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
 3
Author: user1518699, 2013-11-08 23:56:34

ХОРОШО.. Я знаю, что это совсем не эффективно, но просто, интуитивно понятно и легко читается.
Так что, если кто-то ищет не очень замысловатое решение, которое можно расширить для работы с большим количеством значений или более конкретными условиями.. вот простой код:

$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
 3
Author: d.raev, 2015-02-05 16:22:46

Если вы не знаете его ключа, это означает, что это не имеет значения.

Вы можете поместить значение в качестве ключа, это означает, что он мгновенно найдет значение. Лучше, чем использовать поиск по всем элементам снова и снова.

$messages=array();   
$messages[312] = 312;    
$messages[401] = 401;   
$messages[1599] = 1599;   
$messages[3] = 3;    

unset($messages[3]); // no search needed
 3
Author: Ismael, 2016-01-25 10:28:40

В соответствии с вашим требованием " каждое значение может быть только один раз " если вы просто заинтересованы в сохранении уникальных значений в своем массиве, то 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"
}
 3
Author: Mohd Abdul Mujib, 2016-10-12 12:27:27

Или однострочный с использованием оператора or:

($key = array_search($del_val, $messages)) !== false or unset($messages[$key]);
 2
Author: Eric, 2013-09-13 00:43:08

Принятый ответ преобразует массив в ассоциативный массив, поэтому, если вы хотите сохранить его как неассоциативный массив с принятым ответом, вам, возможно, также придется использовать array_values.

if(($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
    $arr = array_values($messages);
}

Ссылка здесь

 2
Author: SaidbakR, 2017-05-23 12:26:36

Вы можете сослаться на этот 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)
}
 1
Author: manish1706, 2016-09-21 06:12:37

Однострочный код (благодаря array_diff()), используйте следующее:

$messages = array_diff($messages, array(401));
 1
Author: Star, 2018-01-29 11:13:37

Еще одна идея для удаления значения массива, используйте 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)

 0
Author: Dana, 2013-09-24 17:17:54