如何使用php删除数组中的特定键?

时间:2011-11-20 08:57:03

标签: php arrays

我有一个包含4个值的数组。我想删除第二个位置的值,然后让其余的键向下移动一个。

$b = array(123,456,789,123);

在第二个位置移除钥匙之前:

  

数组([0] => 123 [1] => 456 [2] => 789 [3] => 123)

在我希望其余的键向下移动一个以填充缺失键的空间

之后
  

数组([0] => 123 [1] => 789 [2] => 123)

我尝试在特定键上使用unset(),但它不会向下移动剩余的键。如何使用php删除数组中的特定键?

5 个答案:

答案 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()

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