11

PHP: Удаление элемента массива по значению (а не по ключу)

12

Проблема:

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

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

Учитывая, что значения в массиве уникальны, как я могу удалить элемент с заданным значением (не зная его ключа)?

5 ответ(ов)

0

Вы используете функцию array_flip() для изменения ключей и значений массива, и затем хотите удалить определенное значение. Однако стоит быть осторожным с этой операцией, так как после первого вызова array_flip() все значения становятся ключами, а ключи — значениями. При этом если значение 'myvalue' отсутствует в массиве $fields, то при unset() ничего не произойдет.

Вот ваш код с пояснениями:

$fields = array_flip($fields); // Меняем местами ключи и значения
unset($fields['myvalue']); // Удаляем элемент с ключом 'myvalue'
$fields = array_flip($fields); // Снова меняем местами ключи и значения

Если вы хотите удалить элемент с определенным значением, лучше использовать array_search для нахождения ключа по значению, а затем удалить его. Это можно сделать следующим образом:

$key = array_search('myvalue', $fields); // Находим ключ по значению
if ($key !== false) { // Проверяем, существует ли ключ
    unset($fields[$key]); // Удаляем элемент по найденному ключу
}

Таким образом, вы избегаете путаницы с array_flip() и эффективно удаляете нужное значение из массива.

0

При использовании PHP 7.4 вы можете использовать стрелочные функции для фильтрации массива. Например, если у вас есть массив $messages, и вы хотите удалить из него значение $del_val, вы можете сделать это следующим образом:

$messages = array_filter($messages, fn ($m) => $m != $del_val);

Однако имейте в виду, что array_filter сохраняет ключи элементов. Если вы хотите, чтобы результат оставался неассоциативным массивом, оберните итоговый массив в array_values(), чтобы сбросить ключи:

$messages = array_values(array_filter($messages, fn ($m) => $m != $del_val));

Таким образом, вы получите индексированный массив без заданного значения.

0

Простым языком, вот способ вручную:

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

Этот метод является самым безопасным, так как вы имеете полный контроль над своим массивом.

0

Ваш код выглядит правильно и выполняет удаление указанного значения из массива. Давайте разберём, как это работает:

Вы определяете функцию array_remove_by_value, которая принимает массив и значение, которое нужно удалить. Внутри функции используется функция array_diff, которая сравнивает два массива: исходный массив и массив, содержащий только значение, которое нужно удалить. Это позволяет получить новый массив без указанного значения.

Функция array_values затем используется для переиндексации массива, чтобы он имел последовательные числовые индексы, начиная с нуля.

Вот краткое описание вашего кода:

function array_remove_by_value($array, $value) {
    return array_values(array_diff($array, array($value)));
}

// Исходный массив
$array = array(312, 401, 1599, 3);

// Удаляем значение 401 из массива
$newarray = array_remove_by_value($array, 401);

// Печатаем новый массив
print_r($newarray);

Вывод:

Array ( [0] => 312 [1] => 1599 [2] => 3 )

Таким образом, в результате выполнения кода, массив без элемента 401 преобразуется в массив [312, 1599, 3], который вы и получаете в итоге. Если у вас есть другие вопросы или нужна помощь по PHP, не стесняйтесь спрашивать!

0

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

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

Пояснение: Этот код удаляет элемент с ключом 401 в массиве $messages, предварительно перевернув массив с помощью функции array_flip(). Функция array_flip() меняет местами ключи и значения массива, и после этого мы можем обратиться к нужному элементу по его значению. Таким образом, ['401'] вернёт ключ в новом массиве, который мы потом используем в unset() для удаления нужного элемента.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь