我有一个包含4个值的数组。我想删除第二个位置的值,然后让其余的键向下移动一个。
$b = array(123,456,789,123);
在第二个位置移除钥匙之前:
数组([0] => 123 [1] => 456 [2] => 789 [3] => 123)
在我希望其余的键向下移动一个以填充缺失键的空间
之后数组([0] => 123 [1] => 789 [2] => 123)
我尝试在特定键上使用unset(),但它不会向下移动剩余的键。如何使用php删除数组中的特定键?
答案 0 :(得分:6)
您需要array_values($b)
才能重新键入数组,以便键是连续的和数字的(从0开始)。
以下应该可以解决问题:
$b = array(123,456,789,123);
unset($b[1]);
$b = array_values($b);
echo "<pre>"; print_r($b);
答案 1 :(得分:2)
array_splice( $b, 1, 1 );
// $b == Array ( [0] => 123 [1] => 789 [2] => 123 )
答案 2 :(得分:1)
没有人提供array_diff_key()的方法,所以我会完整。
代码:
var_export(array_values(array_diff_key($b,[1=>''])));
输出:
array (
0 => 123,
1 => 789,
2 => 123,
)
这种方法不仅可以在单行中提供预期的结果,而且在没有array_key_exists()条件的情况下使用是安全的。
此方法还提供了允许在一个步骤中通过键删除多个元素的附加功能。 JJJ的解决方案也允许这样做,但仅限于连续元素。 array_diff_key()
提供了移除键的灵活性,无论它们在数组中的位置如何。
删除第2和第4个元素(键1和3)的代码:
var_export(array_values(array_diff_key($b,[1=>'',3=>''])));
输出:
array (
0 => 123,
1 => 789,
)
答案 3 :(得分:1)
没有人提到这一点,所以我会这样做:sort()
是你的朋友。
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);
foreach($fruits as $key => $val)
echo "fruits[$key] = $val";
输出:
fruits[0] = apple
fruits[1] = banana
fruits[2] = lemon
fruits[3] = orange
// remove Lemon, too bitter
unset($fruits[2]);
// keep keys with asort
asort($fruits);
foreach($fruits as $key => $val)
echo "fruits[$key] = $val";
输出:
fruits[0] = apple
fruits[1] = banana
fruits[3] = orange
这是您要用来重新索引键的那个:
// reindex keys with sort
sort($fruits);
foreach($fruits as $key => $val)
echo "fruits[$key] = $val";
输出:
fruits[0] = apple
fruits[1] = banana
fruits[2] = orange
答案 4 :(得分:0)
如果要从特定位置的数组中删除项目,可以获取该位置的键,然后取消设置:
$b = array(123,456,789,123);
$p = 2;
$a = array_keys($b);
if ($p < 0 || $p >= count($a))
{
throw new RuntimeException(sprintf('Position %d does not exists.', $p));
}
$k = $a[$p-1];
unset($b[$k]);
这适用于任何PHP数组,无论索引在何处开始,或者字符串是否用于键。
如果您想重新编号剩余的数组,请使用array_values
:
$b = array_values($b);
这将为您提供基于零的数字索引数组。
如果原始数组也是一个从零开始的数字索引数组(如你的问题所示),你可以跳过关于获取密钥的部分:
$b = array(123,456,789,123);
$p = 2;
if ($p < 0 || $p >= count($b))
{
throw new RuntimeException(sprintf('Position %d does not exists.', $p));
}
unset($b[$p-1]);
$b = array_values($b);
或直接使用array_splice
处理偏移而不是键和重新索引数组(输入中的数字键不会保留):
$b = array(123,456,789,123);
$p = 2;
if ($p < 0 || $p >= count($b))
{
throw new RuntimeException(sprintf('Position %d does not exists.', $p));
}
array_splice($b, $p-1, 1);