所以我现在有这个:
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
)
所以我几乎有一个数字排序,其中有两个项目不按顺序排列。
答案 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
请注意,这会返回一个新数组,但不会修改输入数组。