2011-11-20 31 views
9

Tôi có một mảng với 4 giá trị. Tôi muốn loại bỏ giá trị ở vị trí thứ 2 và sau đó có phần còn lại của phím chuyển xuống một.Làm thế nào để loại bỏ một khóa cụ thể trong một mảng bằng cách sử dụng php?

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

Trước Loại bỏ Key ở vị trí thứ 2:

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

Sau khi tôi muốn các phím còn lại để chuyển xuống một để điền vào chỗ trống của thiếu chính

Array ([0] => 123 [1] => 789 [2] => 123)

Tôi đã thử sử dụng unset() trên khóa cụ thể, nhưng nó sẽ không dịch chuyển các phím còn lại. Làm thế nào để loại bỏ một khóa cụ thể trong một mảng bằng cách sử dụng php?

+0

thể trùng lặp của [loại bỏ dòng từ mảng bằng key] (http: // stackoverflow .com/questions/1782041/remove-line-from-array-by-key) – hakre

Trả lời

6

Bạn cần array_values($b) để khóa lại mảng sao cho các khóa là tuần tự và số (bắt đầu từ 0).

Sau đây nên làm như lừa:

$b = array(123,456,789,123); 
unset($b[1]); 
$b = array_values($b); 
echo "<pre>"; print_r($b); 
+0

+1: chỉ cần thêm một kiểm tra: 'array_key_exists' nếu bạn đã bao giờ lập kế hoạch để làm cho động này :) – Nonym

2

Sử dụng array_splice().

array_splice($b, 1, 1); 
// $b == Array ([0] => 123 [1] => 789 [2] => 123) 
0

Nếu bạn muốn xóa một mục từ một mảng ở một vị trí cụ thể, bạn có thể lấy chìa khóa cho vị trí đó và sau đó unset nó:

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

này làm việc với bất kỳ mảng PHP, bất kể nơi bắt đầu lập chỉ mục hoặc nếu chuỗi được sử dụng cho khóa.

Nếu bạn muốn ghi số lại các mảng còn lại chỉ cần sử dụng array_values:

$b = array_values($b); 

Mà sẽ cung cấp cho bạn một zero-based, mảng số lượng được lập chỉ mục.

Nếu mảng ban đầu là một zero-based, mảng số lượng được lập chỉ mục cũng như (như trong câu hỏi của bạn), bạn có thể bỏ qua phần về lấy chìa khóa:

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

Hoặc trực tiếp sử dụng array_splice trong đó đề với offsets thay vì phím tái chỉ mục mảng (phím số ở đầu vào không được bảo quản):

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

không ai đã đề nghị một phương pháp với array_diff_key(), vì vậy tôi sẽ cho đầy đủ.

Code:

var_export(array_values(array_diff_key($b,[1=>'']))); 

Output:

array (
    0 => 123, 
    1 => 789, 
    2 => 123, 
) 

Phương pháp này không chỉ cung cấp các kết quả dự kiến ​​trong một lớp lót, nó là an toàn để sử dụng mà không cần một điều kiện array_key_exists().

Phương pháp này cũng cung cấp tính năng bổ sung cho phép xóa nhiều phần tử bằng khóa trong một bước. Giải pháp của JJJ cũng cho phép điều này, nhưng chỉ với các yếu tố liên tiếp. array_diff_key() dành sự linh hoạt để loại bỏ các khóa bất kể vị trí của chúng trong mảng.

Mã để loại bỏ các yếu tố thứ 2 và thứ 4 (khóa 1 và 3):

var_export(array_values(array_diff_key($b,[1=>'',3=>'']))); 

Output:

array (
    0 => 123, 
    1 => 789, 
) 
Các vấn đề liên quan