4

私はこのコードを持っています:

function cmp_asc($a, $b){
    $ta = date_create_from_format('Y/m/d', $a['props']['t']); //  Y/n/j  si no tienen 0 inicial
    $tb = date_create_from_format('Y/m/d', $b['props']['t']);
    $interval = date_diff($ta, $tb);

    if($interval->days != 0){
        if($interval->invert == 1){
            return 1;
        }else{
            return -1;
        }
    }else{
        return 0;
    }
}

$arr1 = array(
    'props' => array('t' => '2012/05/20')
);

$arr2 = array(
    'props' => array('t' => '2012/05/21')
);

$arr3 = array(
    'props' => array('t' => '2012/04/14')
);

$arr = array($arr1, $arr2, $arr3);

uasort($arr, 'cmp_asc');

['props']['t']そして、 via引数を渡すことができるかどうか知りたいのですが。したがって、次のようになります。

function cmp_asc($a, $b, $key){
    $ta = date_create_from_format('Y/m/d', $a <-- $key -->);
    ...
...

私は変数変数について考えていますが、これが正しい方法であるかどうかはわかりません。他のアイデアはありますか?

4

1 に答える 1

3

自分で関数を呼び出していないため、実際には引数としてではありませんが、クロージャを使用して他の変数を関数に渡すことができます。

$key1 = 'props';
$key2 = 't';

uasort($arr, function ($a, $b) use ($key1, $key2) {
    $ta = date_create_from_format('Y/m/d', $a[$key1][$key2]);
    ...
});

これは単純な例です。動的なキーの深さが必要な場合は、次の行に沿ってもう少しコードが必要になります。

function getValue(array $value, $key) {
    $keys = explode('.', $key);
    foreach ($keys as $k) {
        $value = $value[$k];
    }
    return $value;
}

$arr = array('foo' => array('bar' => 'baz'));
echo getValue($arr, 'foo.bar');

別のアイデアは、クラスを使用することです。その使用法は次のようになります。

$cmp = new ComparisonClass;
$cmp->key = 'props.t';

uasort($arr, array($cmp, 'compare'));

の実装を理解させますComparisonClass

より良い解決策は、ソートする配列の形式を単純に標準化することです。

于 2012-08-16T10:57:20.083 に答える