Cách tốt hơn để bỏ đặt nhiều phần tử mảng


82

Thỏa thuận ở đây là tôi có một mảng với 17 phần tử. Tôi muốn lấy các phần tử tôi cần trong một thời gian nhất định và xóa chúng vĩnh viễn khỏi mảng.

Đây là mã:

$name = $post['name'];
$email = $post['email'];
$address = $post['address'];
$telephone = $post['telephone'];
$country = $post['country'];

unset($post['name']);
unset($post['email']);
unset($post['address']);
unset($post['telephone']);
unset($post['country']);

Có mã là xấu, không cần phải bash. Làm cách nào để làm cho cái này trông đẹp hơn?

Câu trả lời:


104

Sử dụng array_diff_key để xóa

$remove = ['telephone', 'country'];

array_diff_key($post, array_flip($remove));

Bạn có thể sử dụng array_intersect_key nếu bạn muốn cung cấp một mảng khóa để giữ.


6
Không hiểu tại sao phương pháp này không được chấp nhận là câu trả lời chiến thắng vì nó thực sự hoạt động như một sự quyến rũ !!
Alex,

Xuất sắc! Tốt lắm. Tôi thích điều này thay vì lặp qua mảng và bỏ thiết lập các phần tử.
liveso

1
Giải pháp thông minh !!
MAZux

thông minh nhưng chậm đối với các mảng đầu vào lớn. foreach chưa đặt có vẻ nhanh hơn nhiều với các mảng đầu vào lớn và (ít nhất) số lượng khóa tương đối nhỏ để bỏ đặt.
slpic

101

Có vẻ như hàm extract()sẽ là một công cụ tốt hơn cho những gì bạn đang cố gắng thực hiện (giả sử nó trích xuất tất cả các khóa / giá trị từ một mảng và gán chúng cho các biến có cùng tên với các khóa trong phạm vi cục bộ). Sau khi trích xuất nội dung, bạn có thể hủy đặt toàn bộ $post, giả sử rằng nó không chứa bất kỳ thứ gì khác mà bạn muốn.

Tuy nhiên, để thực sự trả lời câu hỏi của bạn, bạn có thể tạo một mảng các khóa mà bạn muốn xóa và lặp lại, xóa chúng một cách rõ ràng ...

$removeKeys = array('name', 'email');

foreach($removeKeys as $key) {
   unset($arr[$key]);
}

... hoặc bạn có thể trỏ biến đến một mảng mới đã xóa các khóa ...

$arr = array_diff_key($arr, array_flip($removeKeys));

... hoặc chuyển tất cả các thành viên của mảng cho unset()...

unset($arr['name'],  $arr['email']);

8
array_diff_key () là một giải pháp tốt. Nghĩ rằng tôi muốn nói thêm rằng bạn có thể sử dụng array_intersect_key () để làm điều ngược lại, giữ các yếu tố nhất định
batfastad

1
Tôi với bbradley - array_diff_key là giải pháp tuyệt vời
Michael

Thật tình cờ, tôi chỉ làm điều này mà không đặt foreach. Sau đó, tôi nghĩ rằng có thể có một giải pháp tốt hơn. Google dẫn tôi đến đây. Vì vậy, tôi đã thử array_diff_key và hóa ra nó chậm hơn nhiều so với foreach đối với các mảng đầu vào lớn (ít nhất là khi số lượng khóa cần bỏ đặt tương đối nhỏ.).
slpic

46

Có một cách khác tốt hơn là các ví dụ trên. Nguồn: http://php.net/manual/en/ Chức năng.unset.php

Thay vì lặp lại toàn bộ mảng và bỏ đặt tất cả các khóa của nó, bạn chỉ có thể bỏ đặt nó một lần như vậy:

Mảng ví dụ:

$array = array("key1", "key2", "key3");

Đối với toàn bộ mảng:

unset($array);

Đối với các khóa duy nhất:

unset($array["key1"]);

Đối với nhiều khóa trong một mảng:

unset($array["key1"], $array["key2"], $array["key3"] ....) and so on.

Tôi hy vọng điều này sẽ giúp bạn trong sự phát triển của bạn.


2

Tôi hiểu câu hỏi này đã cũ, nhưng tôi nghĩ một cách tối ưu có thể là:

$vars = array('name', 'email', 'address', 'phone'); /* needed variables */
foreach ($vars as $var) {
    ${$var} = $_POST[$var]; /* create variable on-the-fly */
    unset($_POST[$var]); /* unset variable after use */
}

Bây giờ, bạn có thể sử dụng $ name, $ email, ... từ mọi nơi;)

NB: extract () không an toàn, vì vậy nó hoàn toàn nằm ngoài nghi vấn!


Vì tò mò - tại sao giải nén () không an toàn?
Srdjan Marjanovic


Oh! Tốt! Cảm ơn!
Srdjan Marjanovic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.