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

hrysbysz  于 2023-02-11  发布在  PHP
关注(0)|答案(7)|浏览(170)

让大脑为一个相当小的问题而冻结。如果我从这样的数组开始:

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

...新元素可能会被添加不同的键,但总是一个数组值。现在我可以肯定第一个元素总是有键'monkey',但我不能肯定任何其他键。
当我填充完数组后,我想把已知的元素'monkey'移到数组的末尾,而不打乱其他元素的顺序,最有效的方法是什么?
我能想到的每一种方法似乎都有点笨拙,我觉得我错过了一些明显的东西。

uqcuzwp8

uqcuzwp81#

我能想到的唯一方法是删除它,然后添加它:

$v = $my_array['monkey'];
unset($my_array['monkey']);
$my_array['monkey'] = $v;
brccelvz

brccelvz2#

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+,或者只是将函数定期定义为全局函数,则需要使用适当的lambda

qhhrdooz

qhhrdooz3#

我真的很喜欢@Gordon上面的回答,因为它作为一个行程序是优雅的,但它只适用于键在开头的情况。下面是另一个行程序,它适用于任何位置的键:

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

**EDIT:**请注意,使用数字键会失败。

mxg2im7a

mxg2im7a4#

你可以实现一些基本的演算,得到一个通用函数,把数组元素从一个位置移动到另一个位置。
对于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

k7fdbhmy

k7fdbhmy5#

这样不行吗?

$ID = array_shift( $IDArray );
    $IDArray[] = $ID;
eqfvzcg8

eqfvzcg86#

基于@cletus answer,我在foreach中使用它来删除特定元素的重复项,并将第一个出现的元素移到数组末尾,如下所示:

foreach($ievent as $k => $ev) {
    
    //make other operations in my foreach           
    ...
                    
    //Delete duplicate CLOSE event
    if($ev['event'] == 'close') {
        if(!$close) {
            $close = $ievent[$k];
        }
        unset($ievent[$k]);
    }           
}
                
//Add first 'close' element to end of array
$ievent[] = $close;
sdnqo3pr

sdnqo3pr7#

在foreach循环中使用数组索引有条件地执行此操作:

$i = 0;
foreach( $items as $item ) {
    if ( $item->Value === 0 ) { // the condition I'm using, you can do whatever
        $item_to_move = $items[$i]; // pick out our item
        unset( $items[$i] ); // take it out of the array
        array_push( $items, $item_to_move); // re-add it (at the end)
    }
    $i++;
}

相关问题