将包含指定关键字的数组项移动到数组的第一个位置,PHP

24

在PHP中,通过最优雅的方式将一个由键选择的数组元素移动到第一个位置是什么?

输入:

$arr[0]=0;
$arr[1]=1;
$arr[2]=2;
....
$arr[n]=n;
$key=10;

输出:

$arr[0]=10;
$arr[1]=0;
$arr[2]=1;
$arr[3]=2;
....
$arr[n]=n;

1
在这个例子中,你并没有“通过键选择元素”。你只是将一个任意值插入到数组的开头。我认为这可能会让其他人感到困惑。 - galymzhan
2
@galymzhan 我认为这暗示着 $arr[10] 之前是 10,现在从 $arr[9]=9 变成了 $arr[10]=11。我同意这个例子没有清晰地说明这一点。更好的做法是 a) 显示正在“移动”的数组元素,b) 使用不同的元素值,这样就不容易混淆键和值。 - octern
看起来最好的办法是用一个临时数组和循环来处理。 - user965748
@octern 是的,我认为你是对的,因为 $arr 的大小保持不变 $arr[n] = n - galymzhan
9个回答

40

使用array_unshift函数:

$new_value = $arr[n];
unset($arr[n]);
array_unshift($arr, $new_value);

同一个数组,看起来好像它的键值没有改变。 - user965748
1
抱歉,我之前打印的是键,让我再试一次。当然可以工作。对于混淆感到抱歉。 - user965748
很高兴能帮到你。请注意,数组之后需要重新索引。在这里阅读如何执行此操作:https://dev59.com/inRB5IYBdhLWcg3wiHz7 - Yan Berk

15

这个问题已经有答案了,但如果您有一个关联数组,您可以使用array_merge函数。

$arr = array_merge([$key=>$arr[$key]], $arr);

编辑(上面显示PHP7+表示法,下面是示例)

$arr = ["a"=>"a", "b"=>"b", "c"=>"c", "d"=>"d"];
$arr = array_merge(["c"=>$arr["c"]], $arr);

这个操作的有效结果

$arr == ["c"=>"c", "a"=>"a", "b"=>"b", "d"=>"d"]

1
太棒了!你救了我的一天。 - user604234
1
这段代码不是在移动元素,而是在复制它吗? - Gonzalingui
@Gonzalingui,您可能是正确的!不过这不取决于数组中的值吗?如果它是标量,则可能会复制它,但如果它是引用值,则只会复制引用而不是值?(我可能错了,但我认为OP问得更多的是关于移动与复制存储在内存中的值的计算机科学基础,而不是更改数组变量中的值。 :)) - Justin

13

不需要取消键。为了简洁起见,请按照以下方式操作。

//appending $new in our array 
array_unshift($arr, $new);
//now make it unique.
$final = array_unique($arr);

演示


7
这个解决方案仅适用于包含数字的数组,并忽略它的键。此外,它正在插入一个新元素,但问题是如何将现有数组项移动到第一个位置。显然,它并没有回答这个问题。 - Gonzalingui

7

可以尝试以下方法。先检查数组键是否存在,获取对应的值,然后将其删除(使用 unset),再利用 array_unshift 创建新的项目并将其置于开头位置。

if(in_array($key, $arr)) {
    $value = $arr[$key];
    unset($arr[$key]);
    array_unshift($arr, $value);
}

4
<?php
$key = 10;
$arr = array(0,1,2,3);
array_unshift($arr,$key);
var_dump($arr) //10,0,1,2,3
?>

1
这会将所选元素前置,但它不会通过键引用它并从数组中的其他位置删除它。 - octern

4

由于任何数字键都将被重新索引(如文档中所述),因此最好使用+数组并集运算符将具有特定键的项目移动到数组的第一个位置:

$item = $arr[$key];
unset($arr[$key]);
$arr = array($key => $item) + $arr;

3
$arr[0]=0;
$arr[1]=1;
$arr[2]=2;
$arr[3]=10;


$tgt = 10;
$key = array_search($tgt, $arr);
unset($arr[$key]);
array_unshift($arr, $tgt);

// var_dump( $arr );
array
0 => int 10
1 => int 0
2 => int 1
3 => int 2

0
$tgt = 10;
$key = array_search($tgt, $arr);
for($i=0;$i<$key;$i++)
{
   $temp = $arr[$i];
   $arr[$i] = $tgt;
   $tgt = $temp;
}

在这段简单的代码后,你所需要做的就是显示重新排列的数组。 :)

0
例如,可以这样写:$arr = [$key => $arr[$key]] + $arr;

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