Я получил этот множественный массив с именем $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 )
Я использую этот код для создания нового массива, состоящего только из «имени». Но это не удалось
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 \ getstarted \ index.php в строке 15
Поэтому мои вопросы:
array_filter
параметра приема array_filter
? Вы можете создать закрытие на PHP ≥5.3.
array_filter($files, function($array) use ($key) { return is_inarr_key($array, $key); } );
Если вы застряли с PHP <5.3, …
Вы можете сделать $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) { ... }
Вы можете использовать функцию 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. }
Я не знаю, можете ли вы предоставить функцию обратного вызова с параметрами, но в качестве предложения вы можете определить функцию обратного вызова для array_filter
array_filter($files, "is_inarr_key");
И чтобы получить name
массива, просто зациклитесь на $file[]
и получите name.
Затем, имея name
вы можете продолжать свою логику.
НТН.
Вы можете использовать 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)
спасибо 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 )