7

usort特定の配列とキーの関数である date_compare() を開始する関数を作成しようとしています。

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...

(したがって、基本的に null であり、スコープは機能しませんでした)。

関数内の関数でスコープがどのように機能するかはわかりませんが、私の記憶が正しければ可能です。globalいくつかの s を投入して初期化しようとしまし$key2たが、これを機能させることができません。

4

2 に答える 2

4

コードが機能しない理由はglobal $key2;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;
    });
}

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

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'));
}
于 2012-09-04T04:30:12.690 に答える
1

もちろん、ジャックスの答えは物事を行う正しい方法ですが、そもそもなぜそれが機能しなかったのか疑問に思った場合に備えて、グローバル変数として
宣言すること$key2は1つの問題にすぎず、もう1つの問題は関数init_date_compareがソートされた配列。
次のコードが機能します。

$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);
于 2012-09-04T04:46:13.167 に答える