我有一个数组,可能包含数字或关联键,或两者兼而有之:
$x = array('a', 'b', 'c', 'foo' => 'bar', 'd', 'e');
print_r($x);
/*(
[0] => a
[1] => b
[2] => c
[foo] => bar
[3] => d
[4] => e
)*/
我希望能够从数组中删除一个项目,重新编号非关联键以保持顺序:
$x = remove($x, "c");
print_r($x);
/* desired output:
(
[0] => a
[1] => b
[foo] => bar
[2] => d
[3] => e
)*/
找到要删除的正确元素是没有问题的,这是问题的关键。 unset
不会对密钥重新编号,而array_splice
会在偏移上工作,而不是密钥(即:从第一个示例中获取$ x,array_splice($x, 3, 1)
将删除“bar”元素而不是“d”元素。
答案 0 :(得分:13)
这应该在保留字符串键的同时重新索引数组:
$x = array_merge($x);
答案 1 :(得分:2)
您可以使用下一个ELEGANT解决方案进行修复:
例如:
<?php $array = array ( 1 => 'A', 2 => 'B', 3 => 'C' ); unset($array[2]); /* $array is now: Array ( 1 => 'A', 3 => 'C' ); As you can see, the index '2' is missing from the array. */ // SOLUTION: $array = array_values($array); /* $array is now: Array ( 0 => 'A', 1 => 'C' ); As you can see, the index begins from zero. */ ?>
答案 2 :(得分:0)
我想出了这个 - 虽然我不确定它是否是最好的:
// given: $arr is the array
// $item is the item to remove
$key = array_search($item, $arr); // the key we need to remove
$arrKeys = array_keys($arr);
$keyPos = array_search($key, $arrKeys); // the offset of the item in the array
unset($arr[$key]);
array_splice($arrKeys, $keyPos, 1);
for ($i = $keyPos; $i < count($arrKeys); ++$i) {
if (is_int($arrKeys[$i])) --$arrKeys[$i]; // shift numeric keys back one
}
$arr = array_combine($arrKeys, $arr); // recombine the keys and values.
为了简洁起见,我遗漏了一些东西。例如,您可以检查数组是否是关联的,以及在使用上述代码之前,您要删除的键是否为字符串。
答案 3 :(得分:0)
尝试使用array_diff()它可能无法正确排序新数组 如果不是以下应该工作
您需要在remove函数中迭代它。
function remove($x,$r){
$c = 0;
$a = array();
foreach ($x as $k=>$v){
if ($v != $r) {
if (is_int($k)) {
$a[$c] = $v;
$c++;
}
else {
$a[$k] = $v;
}
}
}
return $a;
}
DC
答案 4 :(得分:0)
我不认为这个问题有一个优雅的解决方案,您可能需要循环到数组并自行重新排序。