2010-01-04 30 views
6

Tôi có một mảng có thể chứa các phím số hoặc kết hợp, hoặc cả hai:Làm thế nào để loại bỏ các giá trị từ một mảng trong khi renumbering phím số

$x = array('a', 'b', 'c', 'foo' => 'bar', 'd', 'e'); 
print_r($x); 
/*(
    [0] => a 
    [1] => b 
    [2] => c 
    [foo] => bar 
    [3] => d 
    [4] => e 
)*/ 

Tôi muốn để có thể loại bỏ một mục từ mảng, renumbering các phím không kết hợp để giữ cho chúng tuần tự:

$x = remove($x, "c"); 
print_r($x); 
/* desired output: 
(
    [0] => a 
    [1] => b 
    [foo] => bar 
    [2] => d 
    [3] => e 
)*/ 

Tìm các yếu tố quyền gỡ bỏ là không có vấn đề, đó là các phím có vấn đề. unset không đổi lại khóa và array_splice hoạt động trên số bù trừ, thay vì khóa (ví dụ: lấy $ x từ ví dụ đầu tiên, array_splice($x, 3, 1) sẽ xóa phần tử "bar" chứ không phải phần tử "d").

Trả lời

13

này nên lại chỉ số mảng trong khi vẫn giữ phím chuỗi:

$x = array_merge($x); 
0

tôi đã đi lên với điều này - mặc dù tôi không chắc chắn nếu đó là tốt nhất:

// 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. 

Có một vài điều tôi đã rời ra, chỉ vì lợi ích của ngắn gọn. Ví dụ: bạn sẽ kiểm tra xem mảng có phải là kết hợp hay không và liệu khóa bạn đang xóa có phải là chuỗi hay không trước khi sử dụng mã ở trên.

0

Hãy thử array_diff() nó có thể không đặt hàng các mảng mới một cách chính xác dù nếu không phải là sau nên làm việc

Bạn sẽ cần phải lặp qua nó trong hàm 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

0

Tôi không nghĩ rằng có một giải pháp thanh lịch cho vấn đề này, bạn có thể cần phải vòng lặp để mảng và sắp xếp lại các phím của chính mình.

2

Bạn có thể fixet với giải pháp ELEGANT tiếp theo:

Ví dụ:

 
<?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. 
*/ 
?> 
+0

này sẽ loại bỏ tất cả các phi các phím số. Vui lòng đọc lại câu hỏi gốc. – nickf

Các vấn đề liên quan