2010-09-27 31 views
8

Tôi nghĩ rằng tôi có thể không hiểu chính xác cách array_splice được cho là hoạt động. Sự hiểu biết của tôi là tham số đầu tiên là mảng ban đầu của bạn, tham số thứ hai là phần tử bắt đầu tại, và tham số thứ ba là độ dài hoặc số phần tử cần xóa/thay thế.Làm thế nào tôi có thể loại bỏ một thành viên mảng bằng cách sử dụng array_splice trong php?

Vì vậy, tôi có mảng này (print_r đầu ra):

Array ( 
[0] => Array ([TypeFlag] => S [qty] => 1 [denom] => 25 [certMessage] => [totalPrice] => 25) 
[1] => Array ([TypeFlag] => C [qty] => 2 [denom] => 25 [certMessage] => [totalPrice] => 50) 
[2] => Array ([TypeFlag] => V [qty] => 2 [denom] => 25 [certMessage] => test [totalPrice] => 50)) 

Tôi muốn gỡ bỏ hoàn toàn yếu tố thứ hai (mảng với chỉ số 1; TypeFlag = C, vv) Tôi không muốn thay thế nó bằng bất cứ thứ gì; chỉ để trả về mảng với hai phần tử còn lại. Tôi đã thử này (nơi giỏ là tên mảng):

$cart = array_splice($cart, 1,1); 

Nhưng những gì tôi kết thúc với điều này là khi làm một print_r:

Array ([0] => Array ([TypeFlag] => C [qty] => 2 [denom] => 25 [certMessage] => [totalPrice] => 50)) 

Vì vậy, nó dường như được gỡ bỏ 0 và 2 và để lại 1 là phần còn lại. Tôi đang làm gì sai?

Trả lời

14

array_splice trả về một mảng gồm các phần tử được trích xuất.

Bạn đang làm:

$cart = array_splice($cart, 1,1); 

Vì vậy, bạn đang giải nén yếu tố thứ 2 (chỉ số 1) và được gán kết quả trở lại $cart, ghi đè mảng ban đầu của bạn.

Để xóa hoàn toàn phần tử thứ 2, không gán giá trị trả lại là array_splice quay lại $cart. Vì vậy, chỉ cần làm:

array_splice($cart, 1,1); 

này hoạt động vì mảng là thông qua tham khảo đến chức năng.

Ngoài ra nếu bạn muốn loại bỏ một phần tử từ mảng của mình hiệu quả hơn và sạch hơn để sử dụng unset như:

unset($cart[1]); 
+1

Vì vậy, nếu tôi làm điều này bên trong một hàm và cần trả về mảng trừ đi giá trị đã chọn, trước tiên tôi có cần gán $ cart cho một giá trị tạm thời hay không (ví dụ: $ cartTemp = $ cart), sau đó tạo mối nối, sau đó gán lại mảng cho $ cart? Hoặc tôi chỉ làm array_splice ($ cart, 1, 1), sau đó trả lại $ cart? KHÔNG BAO GIỜ MIND - chỉ cần thử nó và nó hoạt động nếu tôi chỉ làm array_splice và sau đó trả lại $ cart. Cảm ơn. – EmmyS

+1

Không. Không cần phải gán nó vào một temp. Chỉ cần gọi hàm, chuyển nó qua mảng và hàm sẽ thay đổi mảng. – codaddict

+0

unset cần các mảng được lập chỉ mục, nếu mảng không có chỉ mục không được đặt, hãy tự thêm chúng và nếu bạn muốn bộ sưu tập của bạn không có chỉ mục, nó sẽ làm mọi thứ lộn xộn lên. – CookieMonster

5

array_splice trả về "loại bỏ/thay thế" yếu tố, mà bạn đang sau đó gán để ghi đè lên ghép một cách chính xác $ giỏ

$discard = array_splice($cart, 1,1); 

hoặc đơn giản là

array_splice($cart, 1,1); 
2

Chỉ cần sử dụng unset():

unset($cart[1]); 
3

Vấn đề duy nhất với việc sử dụng unset() là nó không cập nhật các chỉ mục.

tức là

$arr = array('one', 'two', 'three', 'four'); 
print_r($arr); 

Mảng ( [0] => một [1] => hai [2] => ba [3] => bốn )

unset($arr[2]); 

print_r($arr); 

Mảng ( [0] => một [1] => hai [3] => bốn )

trong khi array_splice sẽ tái-index mảng

$arr = array('one', 'two', 'three', 'four'); 
array_splice($arr,2,1); 
print_r($arr); 

Mảng ( [0] => một [1] => hai [2] => bốn )

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