2

私はかなり面倒な配列構造を使用しており、任意のキーの組み合わせで並べ替える必要があります。以下に 2 つのレコードが表示されますが、並べ替えが実行されると、同じ構造を持つ、または持たない複数のレコードが存在します。

ここに2つのレコードがあります。

Array(

    [0] => Array
    (
        [cid] => 1
        [title] => Mr
        [first_name] => Abet
        [last_name] => Simbad
        [emails] => Array
        (
            [374] => Array
            (
                [eid] => 374
                [name] => ski lodge
                [email] => simbad@skifree.com
            )

            [373] => Array
            (
                [eid] => 373
                [name] => work
                [email] => simbad@work.com
            )

            [375] => Array
            (
                [eid] => 375
                [name] => personal
                [email] => simbad@gmail.com
            )
        )
    )
    [1] => Array
    (
        [cid] => 2
        [title] => Mrs
        [first_name] => Angie
        [last_name] => Stokes
        [emails] => Array
        (
            [590] => Array
            (
                [eid] => 590
                [name] => work
                [email] => angie@gmail.com
            )
        )
    )

emailでは、配列内で昇順で並べ替えたい場合、どうすればemails2 番目の完全なレコードが結果配列で最初になるように取得できますか? angie@gmail.com は simbad@ の前に来ます....

また、一部のレコードにはメール配列が含まれません。それらは結果セットの最後になります。どんな助けでも大歓迎です。

示されている配列は削減されたバージョンですが、住所、メモ、電話、および Web サイトが同じ煩わしい構造になっています。理想的には、次のようなもので並べ替えることができます

$sort = array('emails','email')
$data = sort_data_func('ASC',$sort,$data);

しかし、正しい方向に進むことは何でも役に立ちます。:)

ここに私がこれまでに持っているいくつかのコードがあります

$sort = array('emails','email');
foreach($contacts as $ckey => $c){
    if(is_array($c[$sort[0]])){
        foreach($c[$sort[0]] as $key1 => $sort0){
            if($sort0[$sort[1]]!=''){
                $res[$sort[0]][$ckey][$sort[1]][] = $sort0[$sort[1]];
            }
        }
    }
}
print_r($res);

生成するもの:

Array
(
    [emails] => Array
    (
        [0] => Array
        (
            [0] => simbad@skifree.com
            [1] => simbad@work.com
            [2] => simbad@gmail.com
        )
        [1] => Array
        (
            [0] => angie@gmail.com
        )
    )
)

しかし、ここからどこへ行くべきかわかりません。

EDIT OK 正しい順序でレコードを取得しましたが、結果の配列に最初のレコード ID を保持するにはどうすればよいですか? これが私が使用しているものです。

$direction=='ASC'

function cmp_asc($a, $b){
    $key = current(array_keys($a));
    sort($a[$key]);
    $a[$key] = current($a[$key]);
    sort($b[$key]);
    $b[$key] = current($b[$key]);
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

function cmp_desc($a, $b){
    $key = current(array_keys($a));
    asort($a[$key]);
    $a[$key] = current($a[$key]);
    asort($b[$key]);
    $b[$key] = current($b[$key]);
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

if($direction=='ASC'){
    usort($res[$sort[0]], 'cmp_asc');
}else{
    usort($res[$sort[0]], 'cmp_desc');
}

Array
(
    [emails] => Array
        (
            [0] => Array
                (
                    [email] => Array
                        (
                            [0] => simbad@skifree.com
                            [1] => simbad@work.com
                            [2] => simbad@gmail.com
                        )

                )

            [1] => Array
                (
                    [email] => Array
                        (
                            [0] => angie@gmail.com
                        )

                )
        )
)

Array
(
    [emails] => Array
        (
            [0] => Array
                (
                    [email] => Array
                        (
                            [0] => angie@gmnail.com
                        )

                )

            [1] => Array
                (
                    [email] => Array
                        (
                            [0] => simbad@skifree.com
                            [1] => simbad@work.com
                            [2] => simbad@gmail.com
                        )

                )

        )
)
4

1 に答える 1

2

usort関数の 1つと、2 つの要素を並べ替える順序を検出する自作の比較関数を組み合わせると、うまくいくはずです。

于 2013-09-15T14:20:03.797 に答える