Web

Удаление из массива 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, однако в случае успеха может вернуть ложное значение (например, ваш ключ может быть равен 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

Использование password_hash для хеширования и проверки паролей в PHP

Web

Как поместить информацию в контроллер Laravel 8

Web

Предпочтительный метод хранения массивов PHP (json_encode vs serialize)

Как произвести бесплатное сканирование сайта на ссылки, ошибки и позицию
Web

Как произвести бесплатное сканирование сайта на ссылки, ошибки и позицию