2012-09-04 23 views
7

date_compare()を開始する関数を作成しようとしていますが、これは特定の配列とキーに対してusort関数です。関数の引数を内部関数に渡すか?

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

これは出力:

Notice: Undefined index: in... 

を(したがって、基本的ヌル、スコープが動作しませんでした)。

スコープが関数内の関数でどのように機能するのかよく分かりませんが、私が正しく覚えていれば可能です。私はglobalを投げ込み、$key2を初期化しようとしましたが、これを動作させることができません。

+0

は有用であろう。 –

答えて

4

date_compare()機能の中にinit_date_compare()の機能がないため、コードが機能しないのは、むしろ、グローバルスコープ内でそれを見つけることが期待されます。

さらに、配列は関数パラメータを介して参照渡し(つまり&$array)するか、その配列を返す必要があります。

クロージャは、これが全体の多くよりよい(PHP> = 5.3)になるだろう:

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

もう一つの方法は、状態をカプセル化するオブジェクトを使用することです:

ジャック答えもちろん
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

このケースではglobalが役に立たないことが分かります。前の例で使用したコードは見たことがありませんが、今すぐテストします。 –

+0

ありがとうございました! –

1

あなたがなぜ最初の場所でうまくいかなかったのか疑問に思った場合のために、
グローバル変数として$key2を宣言することは唯一の問題であり、もう1つの問題は関数init_date_compareがソルを返さないということですテッド配列。
次のコードは動作します: `usort`とその親族は、えっ、コールバックに引数を渡すことができれば

$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

ありがとう、私はそれを考えなかった。 –

関連する問題