2012-09-04 12 views
7

Belirli bir dizi ve anahtar için usort işlevi olan date_compare() öğesini başlatmak için bir işlev oluşturmaya çalışıyorum.İşlevsel İşlevleri Bir İç İşleviye Geçirme?

function init_date_compare($key, $array) { 
    $key2 = $key; 
    function date_compare($a, $b) { 
     global $key2; 
     $t1 = strtotime($a[$key2]); $t2 = strtotime($b[$key2]); 
     return $t2 - $t1; 
    } 
    usort($array, "date_compare"); 
} 
$arr = array(array("Aug-2-2012"), array("June-2-2012")); 
$arr = init_date_compare(0, $arr); 
print_r($arr); 

Bu çıkışlar:

Notice: Undefined index: in... 

(Yani temelde boş, kapsam işe yaramadı).

Kapsamlamanın işlevlerin içindeki işlevlerle nasıl çalıştığından emin değilim, ancak doğru hatırlıyorsam, bu mümkün. Bazı global s atmayı denedim ve $key2'u başlatmayı denedim ancak bunu çalışmaya başlayamıyorum.

+0

faydalı olur. –

cevap

4

Kodunuzun çalışmadığı nedeni, date_compare() işlevinin içinde global $key2; işlevinin, init_date_compare() kapsamı içinde yer almamasıdır; bunun yerine küresel kapsam içinde bulmayı bekleyecektir. Bununla birlikte, dizinin her ikisi de, işlev parametreleri aracılığıyla başvuruya (yani &$array) geçirilmeli ya da diziden döndürülmesi gerekir. Bu çok daha nazik (PHP> = 5.3) yapacak

Kapaklar:

function init_date_compare($key, &$array) 
{ 
    usort($array, function(array $a, array $b) use ($key) { 
     $t1 = strtotime($a[$key]); $t2 = strtotime($b[$key]); 
     return $t2 - $t1; 
    }); 
} 

başka yolu da devlet saklanması bir nesne kullanmaktır: Elbette

class DateComparer 
{ 
    private $key; 

    public function __construct($key) 
    { 
     $this->key = $key; 
    } 

    public function compare(array $a, array $b) 
    { 
     $t1 = strtotime($a[$this->key]); $t2 = strtotime($b[$this->key]); 
     return $t2 - $t1; 
    } 
} 

function init_date_compare($key, &$array) 
{ 
    usort($array, array(new DateComparer($key), 'compare')); 
} 
+0

Görüyorum ki bu durumda küresel faydasız. İlk örneğinizde kullandığınız kodu daha önce hiç görmedim, ancak şimdi test edeceğim. –

+0

Teşekkür ederim işe yaradı! –

1

o Jacks cevap bir şey yapmanın DOĞRU YOLU, ancak neden ilk etapta işe yaramadığını merak ettiyseniz: $key2$key2 global değişken sadece bir problem olduğundan, diğer problem init_date_compare fonksiyonunun soruna dönmemesidir. ted dizisi.
Aşağıdaki kod çalışacaktır: usort` ve akraba ha geri arama argümanlar geçebileceği `eğer

$key2=0; 

function init_date_compare($key, $array) { 
    global $key2; 
    $key2 = $key; 
    function date_compare($a, $b) { 
     //global $key2; 
     $t1 = strtotime($a[$key2]); $t2 = strtotime($b[$key2]); 
     return $t2 - $t1; 
    } 
    usort($array, "date_compare"); 
    return $array; 
} 
$arr = array(array("Aug-2-2012"), array("June-2-2012")); 
$arr = init_date_compare(0, $arr); 
print_r($arr); 
+0

Teşekkürler, Bunu hiç düşünmemiştim. –

İlgili konular