Cách lấy một mảng "khóa" cụ thể trong mảng đa chiều mà không lặp lại


115

Giả sử tôi có mảng đa chiều sau (được truy xuất từ ​​MySQL hoặc một dịch vụ):

array(
    array(
        [id] => xxx,
        [name] => blah
    ),
    array(
        [id] => yyy,
        [name] => blahblah
    ),
    array(
        [id] => zzz,
        [name] => blahblahblah
    ),
)

Chúng ta có thể nhận một mảng ids trong một lệnh gọi hàm php "tích hợp sẵn " không? hay một dòng mã?
Tôi biết về vòng lặp truyền thống và nhận được giá trị nhưng tôi không cần điều này:

foreach($users as $user) {
    $ids[] = $user['id'];
}
print_r($ids);

Có thể một số array_map()call_user_func_array()có thể làm điều kỳ diệu.


"Chúng ta có thể lấy một mảng id trong một lệnh gọi hàm không?" vâng, nhưng bạn sẽ phải viết hàm:)
Boris Guéry

@ BorisGuéry, ý tôi là các hàm tích hợp sẵn :-)
ifaour 3/11/11

2
Tái bút: Tôi biết tôi có thể viết foreach($users as $user) {$ids[] = $user['id'];}trong một dòng! nhưng bạn biết tôi muốn nói gì / cần gì :-)
ifaour

@Eugene, rõ ràng là tôi cần mảng cho những thứ khác. Và một lần nữa, điều này chỉ nhằm mục đích giải trí và tìm hiểu các phím tắt mới trong PHP.
ifaour

Câu trả lời:


261

Kể từ php 5.5, bạn có thể sử dụng array_column:

$ids = array_column($users, 'id');

Đây là tùy chọn ưa thích trên bất kỳ dự án hiện đại nào. Tuy nhiên, nếu bạn phải hỗ trợ php> 5.5, các lựa chọn thay thế sau sẽ tồn tại:

Kể từ php 5.3, bạn có thể sử dụng array_mapvới một hàm ẩn danh, như sau:

$ids = array_map(function ($ar) {return $ar['id'];}, $users);

Trước (Về mặt kỹ thuật php 4.0.6+) , bạn phải tạo một hàm ẩn danh với create_function:

$ids = array_map(create_function('$ar', 'return $ar["id"];'), $users);

thật tuyệt, bây giờ nếu có một hàm gốc tương tự như function ($ar) {return $ar['id'];}giá trị trả về của khóa thì thật tuyệt vời! :-)
ifaour

1
tốt, đó không phải là một hàm "tất cả trong một", nhưng C Close (Hàm bất kỳ) là một khái niệm rất mạnh mẽ có thể được sử dụng cho quá trình xử lý như vậy, bạn sẽ thích biết cách sử dụng chúng.
Boris Guéry

Nếu tôi cũng muốn lấy chìa khóa thì sao? Giả sử: $ arr = ['ball' => ['basket' => 5]]; Tôi muốn lấy: $ ball = ['ball' => 5];
Angger

2
@Angger Sau đó, bạn có một câu hỏi khác với câu hỏi này. Vui lòng hỏi nó miễn là bạn đề cập chi tiết hành vi mà bạn mong đợi, ví dụ như kết quả sẽ ra sao nếu đầu vào là ['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]].
phihag

Vì PHP7.4, bạn có thể sử dụng array_mapvới hàm mũi tên:$ids = array_map(fn ($ar) => $ar['id'], $users);
user3601546

13

PHP 5.5+

Bắt đầu PHP5.5 +, bạn có sẵn array_column () , điều này làm cho tất cả những thứ bên dưới trở nên lỗi thời.

PHP 5.3+

$ids = array_map(function ($ar) {return $ar['id'];}, $users);

Giải pháp của @phihag sẽ hoạt động hoàn hảo trong PHP bắt đầu từ PHP 5.3.0, nếu bạn cần hỗ trợ trước đó, bạn sẽ cần sao chép wp_list_pluck đó.

PHP <5,3

Wordpress 3.1+

Trong Wordpress có một chức năng gọi là wp_list_pluck Nếu bạn đang sử dụng Wordpress để giải quyết vấn đề của bạn.

PHP <5,3

Nếu bạn không sử dụng Wordpress , vì mã là mã nguồn mở, bạn có thể sao chép, dán mã vào dự án của mình (và đổi tên hàm thành thứ bạn thích, như array_pick). Xem nguồn tại đây


3

Nếu idlà khóa đầu tiên trong mảng, điều này sẽ làm:

$ids = array_map('current', $users);

Tuy nhiên, bạn không nhất thiết phải dựa vào điều này. :)


-1

Bạn cũng có thể sử dụng array_reduce()nếu bạn thích một cách tiếp cận chức năng hơn

Ví dụ:

$userNames = array_reduce($users, function ($carry, $user) {
    array_push($carry, $user['name']);
    return $carry;
}, []);

Hoặc nếu bạn thích sang trọng,

$userNames = [];
array_map(function ($user) use (&$userNames){
    $userNames[]=$user['name'];
}, $users);

Tuy nhiên, điều này và tất cả các phương thức ở trên đều lặp lại đằng sau;)


Ví dụ đầu tiên của bạn sẽ không trả về một mảng, chỉ là giá trị cuối cùng được tìm thấy cho $ user ['name'] trong mảng. Bạn cần đẩy / nối vào $ carry và trả lại $ carry khi bạn di chuyển.
Progrock
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.