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


94

将关联数组的任何元素移到数组开头的最佳方法是什么?

例如,说我有以下数组:

$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',
);
php 

Answers:


182

您可以使用数组联合运算符(+)通过已知键(one)将原始数组连接到新的关联数组。

$myArray = array('one' => $myArray['one']) + $myArray;
// or      ['one' => $myArray['one']] + $myArray;

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

请参阅php.net/manual/en/language.operators.array.php:

+运算符返回添加到左侧数组的右侧数组;对于两个数组中都存在的键,将使用左侧数组中的元素,而右侧数组中的匹配元素将被忽略。


3
@andrewtweber不,我没有,但是我做了一些测试,发现与Emil的方法相比,它的速度提高了3倍,占用的内存只有原来的一半。我还发现,与将同一元素移到数组末尾相比,它花费的时间多20%。
Mark Eirich

5

如果您有数字数组键并想重新索引数组键,则最array_merge好像这样输入:

$myArray = array_merge(array($key => $value) + $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; 但除此之外:太棒了!1个
nzn 2015年

1

这是使用以下方法完成此任务的另一种简单的方法array_splice()

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

1

如果您有2个数组,则第一个具有要移到第二个元素数组顶部的元素,则可以使用

$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);

-1

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通过键对数组进行排序,并提供自己的排序功能。


嗨-感谢您的回答,尽管我不想以任何方式对数组进行排序。我希望能够知道一个元素键并将该特定元素仅移动到数组的开头

我认为“ =”是语法错误:return = array_reverse($arr, true);
Mark Eirich 2012年

另外,当我运行您的代码时,我得到的数组中只有一个元素... :-(
Mark Eirich 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.