PHP:Удалите все fcn, которые не работают должным образом, код внутри

StackOverflow https://stackoverflow.com/questions/2867255

  •  30-09-2019
  •  | 
  •  

Вопрос

Я сделал эту простую функцию (удалить все $elem из $array):

function remall($array, $elem) {
    for($i=0; $i < count($array); $i++)
        if($array[$i] == $elem)
            unset($array[$i]);
    $newarray = array_values($array);
    return $newarray;
}

Но он не работает идеально, вот некоторые входные и выходные данные.

$u = array(1, 7, 2, 7, 3, 7, 4, 7, 5, 7, 6, 7);
$r = remall($u, 7);
Output of $r: 12345767

$n = array(7, 7, 1, 7, 3, 4, 6, 7, 2, 3, 1, -3, 10, 11, 7, 7, 7, 2, 7);
$r = remall($n, 7);
Output of $r: 1346231-30117727

Обратите внимание, что в моих выходных данных все еще есть 7.Кроме того, моя функция будет удалять только числа из массива.Дайте мне знать, если что-то заметите, спасибо.

РЕШЕНИЕ:Привет, ребята, это то, что сработало для меня (спасибо Флавиусу Стефу)

function remall($array, $elem) {
    return array_values(array_diff($array, array($elem)));
}
Это было полезно?

Решение

я бы пошел с

return array_diff($array, array($elem));

Другие советы

function remall($array, $elem) {
    foreach($array as $k => $v)
        if($v == $elem)
            unset($array[$k]);
    return $array;
}

Можете ли вы гарантировать, что входной массив является числовым (а не ассоциативным) и без «дыр» в ключах?

Вы можете использовать foreach ($array as $key => $value) { ... } скорее, чем for ($i=0; $i < count($array); $i++) { ... }.

Помимо предостережения, описанного в первом абзаце, второй подход (тот, который вы используете сейчас) оценивает count() каждая итерация for - и unset() естественным образом изменит это значение (сначала ваш массив состоит из десяти элементов, затем после первого совпадения в нем будет девять и т. д.).

Другой вариант, позволяющий избежать необходимости полностью создавать собственную функцию, — использовать array_filter() и предоставить собственный метод обратного вызова, хотя это не очень хороший вариант, если ваш критерий сильно меняется (что, поскольку в вашем примере это параметр, похоже, так и будет ;)).

Редактировать:Лучшим решением (наиболее читаемым и удобным в сопровождении, при этом выполняющим именно то, что вы хотите) было бы использовать array_diff(), согласно Флавиус Стефответ:

return array_diff($array, array($elem));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top