array_filter geri arama parametreyi alırsanız mümkün mü?

5 Cevap php

Ben aşağıdaki gibi anahtarları ve değerleri oluşur ki, $files[] adlı bu birden fazla dizi var:

[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
)

Ben yeni bir dizi yalnızca 'name' tuşları oluşur oluşturmak için bu kodu kullanabilirsiniz. Ama başarısız oldu

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

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

ve ben bu hatayı alıyorum:

array_filter () [function.array-filtre]: İkinci argüman, 'is_inarr_key (' isim '), C geçerli bir geri arama olmalıdır: \ xampp \ htdocs php \ Başlarken \ index.php \ 15 hattı üzerinde

Yani benim sorular şunlardır:

  1. O array_filter parametre almak üzerine geri arama fonksiyonu yapmak mümkün mü?
  2. Herhangi bir PHP yerleşik işlevi geri arama nasıl kullanılacağı üzerinde başparmak genel kural nedir?

5 Cevap

Yaptığınız $key global bir değişken olabilir.

function is_inarr_key($array, $key) {
   global $key;
   ....
}

Eğer bir sınıf oluşturabiliriz

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

PHP ≥ 5.3 üzerinde bir kapanışı oluşturabilirsiniz.

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

3 farklı işlevler oluşturabilirsiniz

array_filter($files, 'is_inarr_name');

Kendi array_filter yazabilirsiniz

function my_array_filter($files, $key) {
  ...
}

Eğer parametreleri ile geri çağırma işlevini temin edebilir eğer ben farkında değilim, ama bir öneri olarak, size array_filter için bir geri çağırma işlevi tanımlayabilirsiniz

array_filter($files, "is_inarr_key");

Ve almak için name dizinin, $file[] ve almak içinde sadece döngü name. Sonra, name gidebilirsiniz sahip mantık ile.

HTH.

Siz 5.2.x 'te create_function () kullanabilirsiniz

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

hangi çıkışları

Array ( [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 )

thanks KennyTM for keyfilter class great tip. For those who care and don't know how to do it, this a working detailed example. I slightly improved using a regexp pattern.

$ Dosyalar [] = {} Yukarıdaki kod;

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);

çıktı:

[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
)