如何在阵列上执行自定义排序并保留键

时间:2011-10-20 00:19:43

标签: php arrays

所以我现在有这个:

array(0=>'foo', 1=>'bar', 3=>'baz', 4=>'boo', 5=>'wahoo');

我想要的是:

array(0=>'foo', 3=>'baz', 1=>'bar', 5=>'wahoo', 4=>'boo');

这是一个简化的例子,我的实际数组更大更复杂,所以它不能轻易分解成小块并重新组装。

我一直在使用uksort尝试这个,我认为这是最好的前进方式,但似乎无法得到我想要的结果。

编辑:

我认为我的简化示例实际上是混淆了这个问题。这是我的实际数组以及我想要最终得到的结果。

Array
(
    [1820] => Safety
    [1821] => Security
    [1822] => Digital Life
    [1893] => Privacy and Digital Footprints
    [1823] => Connected Culture
    [1824] => Respecting Creative Work
    [1825] => Searching
    [1826] => Research and Evaluation
    [1836] => Self-Expression and Identity
)

Array
(
    [1820] => Safety
    [1821] => Security
    [1822] => Digital Life
    [1893] => Privacy and Digital Footprints
    [1823] => Connected Culture
    [1836] => Self-Expression and Identity
    [1824] => Respecting Creative Work
    [1825] => Searching
    [1826] => Research and Evaluation
)

所以我几乎有一个数字排序,其中有两个项目不按顺序排列。

3 个答案:

答案 0 :(得分:2)

您实际上在寻找uasort

这将允许您使用自己的排序功能并保留密钥。

uksort根据键而不是值进行排序。

例:
http://codepad.viper-7.com/E8oZ2g

function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

// Array to be sorted
$array = array('a', 'b', 'c', 'b');

echo "<pre>";
print_r($array);
echo "</pre>";

// Sort and print the resulting array
uasort($array, 'cmp');
echo "<pre>";
print_r($array);
echo "</pre>";

输出:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => b
)

Array
(
    [0] => a
    [3] => b
    [1] => b
    [2] => c
)

答案 1 :(得分:1)

基于讨论的新答案。

请使用uksort()

在比较函数中切换匹配并更改它们的开关。

适用于上述示例的示例。

function updateKey($key)
{
   switch($key)
   {
     case 1893:
       return 1822.5;

     case 1836:
       return 1823.5;

     default:
       return $key;
   }
}

function cmp($a, $b) 
{
    $a = updateKey($a);
    $b = updateKey($b);

    // you must do the compare this way for floats (instead of just subtracting) because php implemented the compare callback poorly
    if ($a == $b) 
    {
        return 0;
    }

    return ($a < $b) ? -1 : 1;
}

uksort($array, 'cmp');

答案 2 :(得分:0)

//randomize array preserving keys
function shuffle_assoc( $array )
{
   $keys = array_keys( $array );
   shuffle( $keys );
   return array_merge( array_flip( $keys ) , $array );
}

来源:http://www.php.net/manual/en/function.shuffle.php

请注意,这会返回一个新数组,但不会修改输入数组。