我有以下输入:
array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4
);
我想获得这个:
array(
'a' => 1,
'c' => 3,
'b' => 2,
'd' => 4
);
正如你所看到的,键变了,但它们的值没有变。我知道关联数组中没有固定的顺序 - 在我的情况下这很重要。那么,有什么解决办法吗?
我有以下输入:
array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4
);
我想获得这个:
array(
'a' => 1,
'c' => 3,
'b' => 2,
'd' => 4
);
正如你所看到的,键变了,但它们的值没有变。我知道关联数组中没有固定的顺序 - 在我的情况下这很重要。那么,有什么解决办法吗?
另一种解决方案,适用于任意情况
$array = array(
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4
);
print_r($array);
$myNewOrder = ['a','c','d','b'];
$result = [];
foreach($myNewOrder as $key){
$result[$key] = $array[$key];
}
$array = $result;
print_r($array);
输出:
Array
(
[a] => 1
[b] => 2
[c] => 3
[d] => 4
)
Array
(
[a] => 1
[c] => 3
[d] => 4
[b] => 2
)
array_insert_before
函数(我不确定版权问题,因此不在此处复制其函数体)。function replaceKey(array &$arr, $keyFrom, $keyTo) {
array_insert_before($keyFrom, $arr, $keyTo, $arr[$keyFrom]);
unset($arr[$keyFrom]);
}
function swapKeys(array &$arr, $key1, $key2) {
// $arr = array(x => a, y => b, z => c), $key1 = x, $key2 = z
// generate a random value for "tmp" that is not a key of any element in $arr
for($tmpName = 0; isset($arr[$tmpName]); $tmpName++);
// array(tmp => a, y => b, z => c);
replaceKey($arr, $key1, $tmpName);
// array(tmp => a, y => b, x => c);
replaceKey($arr, $key2, $key1);
// array(z => a, y => b, x => c);
replaceKey($arr, $tmpName, $key2);
}
没有保证,未经测试!这只是一个概念!
(保留HTML标记)如评论所述,这是由您定义的任意顺序。因此,这里提供了一种简单(但不可扩展)的方法,使用辅助数组。
<?php
$start = array(
"a" => 1,
"b" => 2,
"c" => 3,
"d" => 4
);
$aux = array(
"a" => $start["a"],
"c" => $start["b"],
"b" => $start["c"],
"d" => $start["d"],
);
$start = $aux;
var_dump($start);
die();
?>
<?php
$start = array(
"a" => 1,
"b" => 2,
"c" => 3,
"d" => 4
);
$translate = array(
"a" => "a",
"b" => "c",
"c" => "b",
"d" => "d"
);
$aux = array();
foreach($translate as $old => $new) {
$aux[$new] = $start[$old];
}
$start = $aux;
var_dump($start);
die();
?>
$b=array_flip($array);
foreach ($b as $k => $v) {
($k % 2 == 0)?$even[$k]=$v:$odd[$k]=$v;
}
$n=$odd+$even;
$n=array_flip($n);
//print_r($n);
$b=array_flip($array);
shuffle($b);
$new=array_flip($b);
//print_r($new);
function shuffle_assoc($array) {
$keys = array_keys($array);
shuffle($keys);
foreach($keys as $key) {
$new[$key] = $array[$key];
}
$array = $new;
return $array;
}
function shuffle_assoc_by_order($array, $order) {
foreach($order as $key) {
$new[$key] = $array[$key];
}
$array = $new;
return $array;
}
使用方法: shuffle_assoc_by_order($input, ['a', 'c', 'b', 'd']);
感谢所有的答案,这并不像我想象的那么容易。我为此编写了一个通用函数:
/**
* @return array
*/
public final static function swapAssociativeKeys (array &$array, $key1, $key2)
{
for ($i = 0; $i < sizeof($array); $i++)
{
if (array_keys($array)[$i] == $key1)
{
$key1at = $i;
}
if (array_keys($array)[$i] == $key2)
{
$key2at = $i;
}
}
if ($key1at > $key2at)
{
$i = $key1at;
$key1at = $key2at;
$key2at = $i;
}
$order = array();
for ($i = 0; $i < sizeof($array); $i++)
{
if ($i == $key1at)
{
$order[] = array_keys($array)[$key2at];
}
else
{
if ($i == $key2at)
{
$order[] = array_keys($array)[$key1at];
}
else
{
$order[] = array_keys($array)[$i];
}
}
}
$return = array();
foreach ($order as $i)
{
$return[$i] = $array[$i];
}
return $return;
}