PHP:将关联数组元素移动到数组开头

106

如何将关联数组中的任意元素移动到数组开头是最好的方法?

例如,假设我有以下数组:

$myArray = array(
    'two'   => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'one'   => 'Blah Blah Blah 1',
    'four'  => 'Blah Blah Blah 4',
    'five'  => 'Blah Blah Blah 5',
);

我想要做的是将'one'元素移动到开头并得到以下数组:

$myArray = array(
    'one'   => 'Blah Blah Blah 1',
    'two'   => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'four'  => 'Blah Blah Blah 4',
    'five'  => 'Blah Blah Blah 5',
);
6个回答

210
您可以使用数组并集运算符(+)将原始数组与新的关联数组连接起来,使用已知键(one)。
$myArray = array('one' => $myArray['one']) + $myArray;
// or      ['one' => $myArray['one']] + $myArray;

数组键名是唯一的,因此它不可能存在于两个位置。

详见文档数组运算符

+ 运算符将右操作数附加到左操作数的数组中;对于在两个数组中都存在的键名,将使用左操作数数组中的元素,并忽略右操作数数组中的匹配元素。


3
@andrewtweber 我没有这个需求,但是我进行了一些测试,发现与Emil的方法相比,它的速度快三倍,内存占用只有一半。同时,我还发现将同一元素移动到数组末尾要比这个方法慢20%。 - Mark Eirich

7

如果你有数字数组键并且想要重新索引数组键,最好将其放入array_merge中,就像这样:

$myArray = array_merge(array($key => $value) + $myArray );

2

这里有另一个简单的一行代码,使用 array_splice() 来完成此操作:

$myArray = array_splice($myArray,array_search('one',array_keys($myArray)),1) + $myArray;

2

如果有人需要,虽然有点晚了,但我还是创建了这个小代码片段。

function arr_push_pos($key, $value, $pos, $arr) 
{
    $new_arr = array();
    $i = 1;

    foreach ($arr as $arr_key => $arr_value) 
    {
        if($i == $pos) 
            $new_arr[$key] = $value;

        $new_arr[$arr_key] = $arr_value;

        ++$i;
    }

    return $new_arr;
}

只需根据您的需求进行调整,或者使用它并取消索引以进行移动。也适用于关联数组。


更正一下:$new_arr[$arr_key] = $arr_value; 应该改为: if ($arr_key != $key) $new_arr[$arr_key] = $arr_value; 但除此之外,非常棒!1up。 - nzn

1
如果你有两个数组,第一个数组中包含需要移动到第二个数组顶部的元素,你可以使用:
$result = \array_replace($ArrayToMoveToTop, $myArray);

这是一个代码示例:
//source array    
$myArray = [
    'two' => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'one' => 'Blah Blah Blah 1',
    'four' => 'Blah Blah Blah 4',
    'five' => 'Blah Blah Blah 5',
];
// set necessary order
$orderArray = [
    'one' => '',
    'two' => '',
];
//apply it
$result = \array_replace($orderArray, $myArray);
\print_r($result);

-2

在 PHP 手册的 array_unshift 的注释中有一个函数,可以用来将带有键的元素添加到数组的开头:

function array_unshift_assoc(&$arr, $key, $val)
{
    $arr = array_reverse($arr, true);
    $arr[$key] = $val;
    return array_reverse($arr, true);
}

使用上述函数取消设置元素,然后重新插入它:

$tmp = $myArray['one'];
unset($myArray['one']);
$myArray = array_unshift_assoc($myArray, 'one', $tmp);

一个更通用的方法可能是使用 uksort 来按键对数组进行排序,并提供自己的排序函数。

谢谢你的回答,但我不想以任何方式排序数组。我希望能够知道一个元素的键,并将该特定元素移到数组的开头。 - user1493356
我认为“=”是一个语法错误:“return = array_reverse($arr, true);” - Mark Eirich
另外,当我运行你的代码时,我得到的数组只有一个元素... :-( - Mark Eirich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接