Представьте, что вы имеете такую функцию:
function getNumbersDivisibleBy3($arr)
{
$threes = array();
foreach($arr as $val)
{
if($val % 3 == 0)
{
$threes[] = $val;
}
}
return $threes
}
Эта функция отфильтровывает все числа, делящиеся на три из массива и возвращает их в другой массив.
Теперь представьте себе другую функцию:
function GetWordsStartingWithC($arr)
{
$cs = array();
foreach($arr as $word)
{
if($word[0] == 'C')
{
$cs[] = $word;
}
}
return $cs;
}
Эта функция отфильтровывает все слова, которые начинаются с C
из массива слов и возвращает их другой массив.
Если вы посмотрите на вышеперечисленные функции, их мета-функцию (как бы) можно объяснить как «Эти функции фильтруют все элементы в массиве, которые удовлетворяют условию и возвращают их как другой массив».
Таким образом, вместо того, чтобы писать один и тот же код плиты котла, чтобы перебирать список и отфильтровывать все элементы, которые соответствуют, разработчики PHP написали функцию, которая принимает массив и строку, которая является именем функции.
На других языках, таких как C#, вместо строки, которая является именем функции, вы фактически передаете объект, называемый делегатом, который является указателем или ссылкой на функцию. Но на PHP у них есть способы выяснить, какую функцию вы подразумеваете под именем, которое вы передаете. Я не знаю, что это такое.
Так функция array_filter
может выглядеть примерно так (это не будет, как это, вероятно, не написано в PHP)
function array_filter($arr, $callbackname)
{
$result = array();
foreach($arr as $item)
{
if(call_user_func($callbackname, $item))
{
$result[] = $item;
}
}
return $result;
}
В этой функции вы можете увидеть, как это похоже это на двух предыдущих, но вместо предопределенного условия, он перезванивает (используя функцию call_user_func()
) функцию, которая будет использоваться через имя, которое вы передали, и применяет его к каждому элементу массива, используя каждый элемент в качестве параметра для функции.
Таким образом, вы можете уменьшить количество кода, который вы пишете, используя array_filter
, потому что вам не нужно писать код итерации плиты котла, только условную функцию, которую необходимо фильтровать.
Не ответ. Он читает руководство и хочет получить дополнительную помощь. – Greg 2010-11-24 09:52:17
@Greg, тогда OP должен указать, какая дополнительная помощь ему нужна. Я добавил объяснение тому, что делает пример в руководстве, но все это уже указано на странице руководства для array_filter и в приведенной выше ссылке. – Gordon 2010-11-24 09:56:18