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在数组中按升序排序emails,我怎样才能让第二个完整的记录在结果数组中排在第一位?angie@gmail.com 在 simbad@....

此外,一些记录将不包含电子邮件数组。他们将在结果集中排在最后。任何帮助将非常感激。

显示的数组是一个精简版本,但我的地址、注释、电话和网站具有相同的烦人结构。理想情况下,我可以用类似的东西排序

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

但我不知道从这里去哪里。

编辑 好的我现在有当前顺序的记录,但是如何在结果数组中保留初始记录 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函数与一个自行编写的比较函数相结合,该函数检测两个元素的排序顺序,应该可以解决问题。

于 2013-09-15T14:20:03.797 回答