如何根据PHP中另一个(部分)数组的值对数组进行排序?

时间:2014-04-03 12:04:42

标签: php arrays

如何根据PHP中另一个(部分)数组的值对数组进行排序?即$toBeSorted是目标数组,$sortByThis提供密钥(不是所有密钥!):

// Array to be sorted (mantaining key-values correlations)
$toBeSorted = array(
    'id'       => 'Identifier',
    'username' => 'Username',
    'phone'    => 'Phone number',
    'email'    => 'E-mail',
);

$sortByThis = array('username', 'id');

// Result should be username, id, email, phone
// The remaining portion of array should be sorted with ksort()

我记得(但我并非100%确定)快速执行此操作的功能。实际上我已经使用过:

// Sort the first portion of the array
$sorted = array_intersect_key($toBeSorted, array_flip($sortByThis));

// Sort the remaining portion
$remain = array_diff_key($toBeSorted, $sorted);
ksort($remain);

$toBeSorted = array_merge($sorted, $remain);

3 个答案:

答案 0 :(得分:1)

您可以使用 uksort 组合在一起。

uksort($toBeSorted, function($a, $b) use ($sortByThis) {
    $key_a = array_search($a, $sortByThis);
    $key_b = array_search($b, $sortByThis);
    if ($key_a === false && $key_b === false) {
        return strcmp($a, $b);
    } else if ($key_a === false) {
        return 1;
    } else if ($key_b === false) {
        return -1;
    } else {
        return $key_a - $key_b;
    }
});

<强> THE DEMO.

答案 1 :(得分:1)

简单地使用array_merge似乎有效:

ksort($toBeSorted);
print_r(array_merge(array_flip($sortByThis), $toBeSorted));

输出:

Array
(
    [username] => Username
    [id] => Identifier
    [email] => E-mail
    [phone] => Phone number
)

链接到codepad

答案 2 :(得分:0)

查看array_multisort()函数。 http://php.net/manual/en/function.array-multisort.php

你可以通过这样做来实现这一点。

$sorted_arr= array_multisort($toBeSorted, array('username'=>SORT_ASC, 'id'=>SORT_ASC));

如果这对您没有帮助,则用户提交了其他功能。