2010-11-24 7 views
1

при чтении Абт array_filter() из PHP инструкции, пришел к лицу пример demostrate
ту же функцию, используя функцию обратного вызова, как указано нижерабочей функции обратного вызова

<?php 
function odd($var) 
{ 
    // returns whether the input integer is odd 
    return($var & 1); 
} 

function even($var) 
{ 
    // returns whether the input integer is even 
    return(!($var & 1)); 
} 

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5); 
$array2 = array(6, 7, 8, 9, 10, 11, 12); 

echo "Odd :\n"; 
print_r(array_filter($array1, "odd")); 
echo "Even:\n"; 
print_r(array_filter($array2, "even")); 
?> 

пожалуйста, вы можете помочь мне знать, как на самом деле вызов функции calback, фактический проход параметров, работающий? Любая ссылка для демонстрации обратного вызова wld будет большой помощью.

ответ

1

В двух приведенных примерах array_filter будет передавать значения в переданном массиве и отправлять каждое значение в него функции обратного вызова (odd или even). Затем функция обратного вызова проверяет значение, чтобы увидеть, является ли оно нечетным или четным, и возвращает TRUE или FALSE. Если он возвращает FALSE, значение фильтруется из массива.

Самый простой способ узнать, какая функция передается вашему обратному вызову, - это обеспечить обратный вызов, который печатает переданные аргументы, например.

array_filter($anArray, function() { var_dump(func_get_args()) }); 

Callbacks подробно описаны в

+1

Не ответ. Он читает руководство и хочет получить дополнительную помощь. – Greg 2010-11-24 09:52:17

+3

@Greg, тогда OP должен указать, какая дополнительная помощь ему нужна. Я добавил объяснение тому, что делает пример в руководстве, но все это уже указано на странице руководства для array_filter и в приведенной выше ссылке. – Gordon 2010-11-24 09:56:18

0

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

Итак, вы в основном говорите array_filter(): пропустите этот массив и примените эту функцию с именем «нечетно» к каждому элементу; эта функция вернет логическое значение, чтобы вы знали, что сохранить и что отбросить.

1

Представьте, что вы имеете такую ​​функцию:

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

Смежные вопросы