это возможно, если обратный вызов в array_filter получить параметр? - PullRequest
13 голосов
/ 27 марта 2010

Я получил этот массив с именем $files[], который состоит из ключей и значений, как показано ниже:

[0] => Array
(
    [name] => index1.php
    [path] => http://localhost/php/gettingstarted/
    [number] => 1
)

[1] => Array
(
    [name] => index10.php
    [path] => http://localhost/php/gettingstarted/
    [number] => 2
)

[2] => Array
(
    [name] => index11.php
    [path] => http://localhost/php/gettingstarted/
    [number] => 3
)

Я использую этот код для создания нового массива, состоящего только из ключей 'name'. Но это не удалось

array_filter($files, "is_inarr_key('name')");

function is_inarr_key($array, $key)
{
    //TODO : remove every array except those who got the same $key
}

и я получаю эту ошибку:

array_filter () [function.array-filter]: второй аргумент 'is_inarr_key (' name ')' должен быть допустимым обратным вызовом в C: \ xampp \ htdocs \ php \ gettingstarted \ index.php в строке 15

Итак, мои вопросы:

  1. Возможно ли сделать функцию обратного вызова для array_filter параметра приема?
  2. Какое общее правило о том, как использовать обратный вызов в любой встроенной функции PHP?

Ответы [ 5 ]

42 голосов
/ 27 марта 2010

Вы можете создать замыкание на PHP ≥5.3.

array_filter($files, function($array) use ($key) {
  return is_inarr_key($array, $key); 
} );

Если вы застряли с PHP <5.3,… </p>

Вы можете сделать $key глобальной переменной.

function is_inarr_with_global_key($array) {
   global $key;
   ....
}

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

class KeyFilter {
  function KeyFilter($key) { $this->key = $key; }
  function is_inarr_key($array) { ... }
}
...
array_filter($files, array(new KeyFilter('name'), 'is_inarr_key'));

Вы можете создать 3 различные функции

array_filter($files, 'is_inarr_name');
array_filter($files, 'is_inarr_path');
array_filter($files, 'is_inarr_number');

Вы можете написать свой собственный array_filter

function my_array_filter($files, $key) {
  ...
}
2 голосов
/ 27 марта 2010

Вы можете использовать функцию array_walk как:

$arr = array(
        array("name" => "Jack", "id" => 1),
        array("name" => "Rose", "id" => 2),
    );

$result = array(); // initialize result array.
array_walk($arr, "filter"); // iterate over the array calling filter fun for each value.
// $result will now have elements "Jack" and "Rose"

function filter($a) {

    global $result; // to access the global result array.

    $result[] = $a['name']; // for each array passed, save the value for the key 'name' in the result array.
}
1 голос
/ 21 ноября 2012

спасибо KennyTM за класс ключевых фильтров отличный совет . Для тех, кто заботится и не знает, как это сделать, это рабочий подробный пример. Я немного улучшил использование шаблона регулярных выражений.

$ files [] = {код выше};

class KeyFilter {
    function KeyFilter($attr,$pattern)
    {
        $this->attr=$attr;
        $this->pattern=$pattern;
    }
    function is_inarr_key($t)
    {
        return preg_match($this->pattern,$t[$this->attr]);;
    }
}


$t=array_filter($items, array(new KeyFilter("path","~\d{2}\.php~i"), 'is_inarr_key'));
print_r($t);
print_r($o->key);

выход:

[1] => Array
(
    [name] => index**10**.php
    [path] => http://localhost/php/gettingstarted/
    [number] => 2
)

[2] => Array
(
    [name] => index**11**.php
    [path] => http://localhost/php/gettingstarted/
    [number] => 3
)
1 голос
/ 08 февраля 2011

Вы можете использовать create_function () в 5.2.x

$y = 5;
$func = 'return $x > ' . $y . ';';
$f = create_function('$x', $func);
$numbers = range(0, 10);
$result = array_filter($numbers, $f);
print_r($result);

который выводит

Массив ( [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 )

1 голос
/ 27 марта 2010

Я не знаю, можете ли вы предоставить функции обратного вызова параметры, но в качестве рекомендации вы можете определить функцию обратного вызова для array_filter

array_filter($files, "is_inarr_key");

и получить name массивапросто переберите $file[] и получите name. Затем, имея name, вы можете продолжить свою логику.

HTH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...