如何在PHP中将已知键的数组元素移动到数组末尾?

63

我在一个相当琐碎的问题上卡住了。如果我从这样一个数组开始:

$my_array = array(
                  'monkey'  => array(...),
                  'giraffe' => array(...),
                  'lion'    => array(...)
);

...并且可能会添加具有不同键但始终为数组值的新元素。现在我可以确定第一个元素将始终具有键“monkey”,但我无法确定其他任何键。

填充数组后,我想将已知元素“monkey”移动到数组末尾,而不影响其他元素的顺序。最有效的方法是什么?

我能想到的每种方法都有点笨重,感觉自己漏了什么明显的东西。

4个回答

122
我能想到的唯一方法是将其删除再添加回去:
$v = $my_array['monkey'];
unset($my_array['monkey']);
$my_array['monkey'] = $v;

12

array_shift 可能比 删除索引 的方法效率低一些,但它可以实现相同的功能:

$my_array = array('monkey' => 1, 'giraffe' => 2, 'lion' => 3);
$my_array['monkey'] = array_shift($my_array);
print_r($my_array);

另一种替代方案是使用回调和uksort函数:

uksort($my_array, create_function('$x,$y','return ($y === "monkey") ? -1 : 1;'));

如果你使用的是PHP5.3+,你需要使用适当的匿名函数,否则只需将函数定义为常规全局函数即可。


两个都是好答案。排序是我想到的,但似乎有点过头了。 - tamewhale
2
@tamewhale 谢谢。我对24个动物进行了一个非常肤浅的基准测试,unset确实是最快的。它比array_shift快10倍,比uksort快300倍。 - Gordon
热爱单行代码-虽然这可能不是最高效的方法,但在大多数情况下都不会有影响,而使用 array_shift() 方法优雅的风格使代码更加简洁易读。 - But those new buttons though..
3
使用 array_shift 的第一个解决方案仅适用于数组的第一个元素。 - yenren

4

我非常欣赏@Gordon的回答,因为它作为一行代码非常简洁优雅,但是它只适用于目标键存在于数组的第一个元素中的情况。这里是另一种一行代码,它适用于任何位置上的键:

$arr = ['monkey' => 1, 'giraffe' => 2, 'lion' => 3];
$arr += array_splice($arr, array_search('giraffe', array_keys($arr)), 1);

演示

  • 注意,这段代码对于数值键可能会失败,因为数组合并运算符(+=)与数值键的工作方式不同 (演示)。
  • 此外,此代码片段假设目标键已经在数组中存在。如果目标键不存在,则结果将错误地将第一个元素移动到末尾,因为array_search()将返回false,然后被array_splice()转成0(演示)。

-1

您可以实现一些基本的微积分,得到一个通用函数,用于将数组元素从一个位置移动到另一个位置。

对于PHP,它看起来像这样:

function magicFunction ($targetArray, $indexFrom, $indexTo) { 
    $targetElement = $targetArray[$indexFrom]; 
    $magicIncrement = ($indexTo - $indexFrom) / abs ($indexTo - $indexFrom); 

    for ($Element = $indexFrom; $Element != $indexTo; $Element += $magicIncrement){ 
        $targetArray[$Element] = $targetArray[$Element + $magicIncrement]; 
    } 

    $targetArray[$indexTo] = $targetElement; 
}

请查看 "gloommatter" 上的 "移动数组元素",以获取详细说明。

http://www.gloommatter.com/DDesign/programming/moving-any-array-elements-universal-function.html


1
这个问题是关于将关联数组中的单个元素移动到该数组的末尾。这段代码与此无关。 - miken32

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