1

次のマルチソート方法を検討してください。この場合、特定の開始日を持つアイテムの配列があります。配列の例を次に示します。

0 -> array('title' => 'hello',
             'attributes' => array('id' => 4, 'startdate' => '2013-06-11')),
1 -> array('title' => 'hello second entry',
             'attributes' => array('id' => 6, 'startdate' => '2013-04-11'))

2 番目のエントリが最初のエントリの前に来ることがわかります。配列の深さ 1 までしかチェックしないため、現在、呼び出しを使用しても機能しません。

$albums = $this->multiSort($items, "SORT_ASC", 'startdate', true);

このメソッドを変更して、配列内の項目に対して深度検索を実行するにはどうすればよいでしょうか。さらに良いのは、深度キーを指定できることです。メソッドに追加のパラメーターを追加する必要はありません。

このようにメソッドを呼び出してから for ループを記述してキー データを取得することもできますが、for ループをネストすることは私がやりたいことではありません。

$albums = $this->multiSort($items, "SORT_ASC", array('attributes', 'startdate') , true);

私の場合、この方法を最適化する最良の方法は何ですか?

public function multiSort($data, $sortDirection, $field, $isDate) {

    if(empty($data) || !is_array($data) || count($data) < 2) {
        return $data;
    }

    foreach ($data as $key => $row) {
        $orderByDate[$key] = ($isDate ? strtotime($row[$field]) : $row[$field]);
    }

    if($sortDirection == "SORT_DESC") {
        array_multisort($orderByDate, SORT_DESC, $data);
    } else {
        array_multisort($orderByDate, SORT_ASC, $data);
    }

    return $data;
}
4

1 に答える 1

0

更新しました。これにより、区切られた、目的のフィールドへのパスであるフィールドの文字列を渡すことができます。

$items = Array();
$items[0] = array('title' => 'hello',
             'attributes' => array('id' => 4, 'startdate' => '2013-06-11'));
$items[1] = array('title' => 'hello second entry',
             'attributes' => array('id' => 6, 'startdate' => '2013-04-11'));

function multiSort($data, $sortDirection, $field, $isDate) {

    if(empty($data) || !is_array($data) || count($data) < 2) {
        return $data;
    }

    // Parse our search field path
    $parts = explode("/", $field);

    foreach ($data as $key => $row) {
        $temp = &$row;
        foreach($parts as $key2) {
            $temp = &$temp[$key2];
        }
        //$orderByDate[$key] = ($isDate ? strtotime($row['attributes'][$field]) : $row['attributes'][$field]);
        $orderByDate[$key] = ($isDate ? strtotime($temp) : $temp);
    }
    unset($temp);

    if($sortDirection == "SORT_DESC") {
        array_multisort($orderByDate, SORT_DESC, $data);
    } else {
        array_multisort($orderByDate, SORT_ASC, $data);
    }

    return $data;
}

$albums = multiSort($items, "SORT_ASC", 'attributes/startdate', true);
print_r($albums);

出力:

Array
(
    [0] => Array
        (
            [title] => hello second entry
            [attributes] => Array
                (
                    [id] => 6
                    [startdate] => 2013-04-11
                )

        )

    [1] => Array
        (
            [title] => hello
            [attributes] => Array
                (
                    [id] => 4
                    [startdate] => 2013-06-11
                )

        )

)
于 2013-09-11T19:39:33.227 に答える