6

我有一个数组,它可能包含数字键或关联键,或两者兼有:

$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_spliceoffset上工作,而不是在 key 上工作(即:从第一个示例中获取 $x,array_splice($x, 3, 1)将删除“bar”元素而不是“d”元素)。

4

5 回答 5

13

这应该在保留字符串键的同时重新索引数组:

$x = array_merge($x);
于 2010-01-04T05:57:20.260 回答
2

您可以使用下一个 ELEGANT 解决方案进行修复:

例如:

<?php

$数组 = 数组 (
    1 => 'A',
    2 => 'B',
    3 => 'C'
);

未设置($数组[2]);

/* $array 现在是:
大批 (
    1 => 'A',
    3 => 'C'
);
如您所见,数组中缺少索引“2”。
*/

// 解决方案:
$array = array_values($array);

/* $array 现在是:
大批 (
    0 => 'A',
    1 => 'C'
);
如您所见,索引从零开始。
*/
?>
于 2011-01-08T14:30:20.447 回答
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.

为了简洁起见,我遗漏了一些东西。例如,在使用上述代码之前,您将检查数组是否是关联的,以及您要删除的键是否是字符串。

于 2010-01-04T03:12:59.920 回答
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;
}

直流

于 2010-01-04T03:15:15.643 回答
0

我认为这个问题没有一个优雅的解决方案,您可能需要循环到数组并自己重新排序键。

于 2010-01-04T03:15:51.040 回答