Есть ли более простой способ понять отрицание результата функции?

#php

#php

Вопрос:

Недавно мне пришлось написать фрагмент кода, где я использовал следующее; но это было очень запутанно для меня и заняло больше времени, чем следовало

Я продолжаю теряться из-за отрицания и превращения false в true, а затем, возможно, обратно. В конечном итоге я решаю эти проблемы методом проб и ошибок.

Вот код для избавления от пустых элементов. Примечание, возможно, есть код получше, но мне интересно знать, как это продумать

 array_filter($array, "eliminate");

function eliminate($v)
{
   return !(empty($v));
}
  

Комментарии:

1. Мне просто интересно, почему вы просто не возвращаете empty() ? Если вы «избавляетесь от пустых элементов» (я уверен, что вы имеете в виду переменные здесь, верно?), если empty() возвращает true, этот элемент пуст. В этом случае вам даже не нужно eliminate() , если только у вас не происходит что-то еще, чего вы не включили, или вам нужна другая функция в качестве заполнителя на будущее.

2. Этот вопрос явно требует, чтобы больше людей цитировали руководство

3. @Jared: array_filter удаляет элементы при возврате обратного вызова false . Если бы он просто вернул empty() , это удалило бы все непустые элементы.

4. @Rocket — Это, безусловно, отвечает на мой вопрос. Я думаю, что Doh('!') в порядке. Спасибо!

5. Я думаю, что ваша проблема связана с именем функции. Как говорит Rocket, фильтр удаляет элементы, если обратный вызов возвращает false , сохраняет их, если возвращает true , поэтому лучшим названием было бы «сохранить».

Ответ №1:

array_filter принимает два аргумента. Первый — это массив. Второй — это обратный вызов. Здесь вы используете имя функции, содержащееся в строке "eliminate" , чтобы сообщить PHP, какую функцию вы хотите вызвать.

Цель array_filter — удалить элементы из массива, если они вам не нужны. Функция из второго аргумента вызывается для каждого элемента в массиве. Элемент передается в качестве первого аргумента этой функции — поэтому $v в вашем приведенном выше коде установлено значение элемента, на который мы смотрим. Если вы возвращаетесь true из своего обратного вызова, элемент сохраняется в массиве. Если вы вернетесь false , он будет удален.

Ваша функция возвращает true или false на основе следующего:

 return !(empty($v));
  

empty возвращает, true если элемент пуст (например, пустая строка, пустой массив, целое число 0 и другие). ! Оператор меняет ситуацию. Таким образом, функция вернет false (и удалит элемент из массива), если элемент пуст. В противном случае он вернет true и сохранит его.

Ваша функция приблизительно эквивалентна следующему циклу:

 $newArray = array();
foreach ($oldArray as $key=>$value) {
    if (!empty($value)) {
        $newArray[$key] = $value;
    }
}
  

Ответ №2:

 Iterates over each value in the input array passing them to the callback function. If the 
callback function returns true, the current value from input is returned into the result array.
Array keys are preserved.
  

Источник: http://php.net/array_filter

Каждый элемент передается для устранения функции. Теперь внутри исключения, если переданное значение пустое, оно вернет false и ему не будет места в следующем массиве.

Пожалуйста, обратите внимание, что ваш код ничего не делает, потому что вы должны делать:

 $newArray=array_filter($array, "eliminate"); //< note the newarray

function eliminate($v)
{
   return !(empty($v));
}
  

Или лучший код с PHP 5.3

 $newArray=array_filter($array, function ($v){
       return !(empty($v));
    } );
  

Ответ №3:

Лучший способ обдумать этот код — «проговорить» его:

Давайте начнем с eliminate , eliminate возвращает, true когда $v не является пустым, false в противном случае

Теперь array_filter применяет указанную функцию, вот она eliminate , к каждому элементу в $array , по одному за раз.

Наконец, нам нужно понять, что если для некоторого отдельного элемента $v в $array eliminate($v) возвращает true , то этот элемент удаляется.

Ответ №4:

array_filter запускает функцию обратного вызова для каждого элемента массива. Если обратный вызов возвращает true , элемент сохраняется, если false он удален.

Итак, для каждого элемента в $array он проверяет, является ли это empty() . Если это не так, оно остается в массиве, если да, то оно уходит. empty() возвращает true значение, если оно пустое (что означает, что мы хотим удалить его из массива), поэтому нам нужно вернуть false .

Если вы вызываете array_filter без обратного вызова, это удаляет вещи, которые преобразуются в false , поэтому в вашем случае $array = array_filter($array); должно сработать.

array_filter возвращает вам измененный массив.

Комментарии:

1. Вау, спасибо вам, ребята, за весь код и пояснения. Хотя я знал, что делает код, мне все еще было трудно следовать ходу мысли, чтобы написать это. Я продолжаю листать и заполнять. Я не имею в виду конкретно этот случай, а просто приведу пример. Кажется, я не могу ясно представить это. Возможно, я просто неправильно это изучаю

Ответ №5:

Просто используйте:

 array_filter($array);
  

Это приведет к удалению каждого пустого элемента массива — результат должен быть идентичен показанному вами коду (с функцией ‘eliminate’ и !(empty($v)) кодом).