วิธีรับอาร์เรย์ของ "คีย์" เฉพาะในอาร์เรย์หลายมิติโดยไม่ต้องวนซ้ำ


115

สมมติว่าฉันมีอาร์เรย์หลายมิติต่อไปนี้ (ดึงมาจาก MySQL หรือบริการ):

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

เราสามารถรับอาร์เรย์ของids ในการเรียกฟังก์ชัน php " ในตัว " ได้หรือไม่? หรือรหัสหนึ่งบรรทัด?
ฉันตระหนักถึงการวนซ้ำแบบเดิมและรับค่า แต่ฉันไม่ต้องการสิ่งนี้:

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

อาจจะบางarray_map()และcall_user_func_array()สามารถทำเวทมนตร์


"เราสามารถรับอาร์เรย์ของรหัสในการเรียกฟังก์ชันเดียวได้หรือไม่" ใช่ แต่คุณจะต้องเขียนฟังก์ชัน
:)

@ BorisGuéryฉันหมายถึงฟังก์ชันในตัว :-)
ifaour

2
PS: ฉันรู้ว่าฉันเขียนได้foreach($users as $user) {$ids[] = $user['id'];}ในบรรทัดเดียว! แต่คุณรู้ว่าฉันหมายถึงอะไร / ต้องการ :-)
ifaour

@ ยูจีนฉันต้องการอาร์เรย์สำหรับสิ่งอื่น ๆ อย่างชัดเจน และอีกครั้งนี่เป็นเพียงเพื่อความสนุกสนานและการเรียนรู้ shorthands ใหม่ใน PHP เท่านั้น
ifaour

คำตอบ:


261

ตั้งแต่ php 5.5 คุณสามารถใช้array_column:

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

นี่คือตัวเลือกที่ต้องการสำหรับโครงการสมัยใหม่ใด ๆ อย่างไรก็ตามหากคุณต้องรองรับ php> 5.5 จะมีทางเลือกต่อไปนี้:

ตั้งแต่ php 5.3 คุณสามารถใช้array_mapกับฟังก์ชันที่ไม่ระบุชื่อได้เช่นนี้:

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

ก่อน(ทางเทคนิค php 4.0.6+)คุณต้องสร้างฟังก์ชันที่ไม่ระบุตัวตนโดยcreate_functionใช้:

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

ดีตอนนี้ถ้ามีฟังก์ชันดั้งเดิมที่คล้ายกับการfunction ($ar) {return $ar['id'];}คืนค่าของคีย์ที่จะยอดเยี่ยม! :-)
ifaour

1
นั่นไม่ใช่ฟังก์ชัน "ทั้งหมดในที่เดียว" แต่การปิด (ฟังก์ชันที่ไม่ระบุชื่อ) เป็นแนวคิดที่มีประสิทธิภาพมากซึ่งอาจใช้สำหรับการประมวลผลดังกล่าวคุณจะอยากรู้วิธีใช้
Boris Guéry

ถ้าอยากได้กุญแจด้วยต้องทำอย่างไร? สมมติว่า: $ arr = ['ball' => ['basket' => 5]]; ฉันต้องการรับ: $ ball = ['ball' => 5];
Angger

2
@ แองเกอร์แล้วคุณมีคำถามอื่นที่ไม่ใช่คำถามนี้ รู้สึกอิสระที่จะถามมัน['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]]ตราบเท่าที่คุณพูดถึงในรายละเอียดสิ่งที่คุณคาดหวังพฤติกรรมเช่นสิ่งที่ควรจะส่งผลถ้าใส่เป็น
phihag

เนื่องจาก PHP7.4 คุณสามารถใช้array_mapกับฟังก์ชันลูกศร:$ids = array_map(fn ($ar) => $ar['id'], $users);
user3601546

13

PHP 5.5+

เริ่มต้น PHP5.5 + คุณจะมีarray_column ()ให้ใช้งานซึ่งทำให้ทั้งหมดด้านล่างล้าสมัย

PHP 5.3 ขึ้นไป

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

โซลูชันโดย @phihag จะทำงานได้อย่างไม่มีที่ติใน PHP โดยเริ่มจาก PHP 5.3.0 หากคุณต้องการการสนับสนุนก่อนหน้านั้นคุณจะต้องคัดลอก wp_list_pluck นั้น

PHP <5.3

Wordpress 3.1+

ใน Wordpress มีฟังก์ชันที่เรียกว่าwp_list_pluck หากคุณใช้ Wordpress ที่ช่วยแก้ปัญหาของคุณได้

PHP <5.3

หากคุณไม่ได้ใช้ Wordpressเนื่องจากโค้ดเป็นโอเพนซอร์สคุณสามารถคัดลอกและวางโค้ดในโปรเจ็กต์ของคุณได้ (และเปลี่ยนชื่อฟังก์ชันเป็นสิ่งที่คุณต้องการเช่น array_pick) ดูแหล่งที่มาที่นี่


3

ถ้าidเป็นคีย์แรกในอาร์เรย์สิ่งนี้จะทำ:

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

คุณไม่ควรพึ่งพาสิ่งนี้เสมอไป :)


-1

คุณยังสามารถใช้array_reduce()หากคุณต้องการแนวทางที่ใช้งานได้มากกว่านี้

ตัวอย่างเช่น:

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

หรือถ้าคุณชอบเป็นแฟนซี

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

วิธีนี้และวิธีการทั้งหมดข้างต้นจะวนซ้ำอยู่เบื้องหลัง;)


ตัวอย่างแรกของคุณจะไม่ส่งคืนอาร์เรย์เพียงแค่ค่าสุดท้ายที่พบสำหรับ $ user ['name'] ในอาร์เรย์ คุณต้องกด / ต่อท้าย $ carry และส่งคืน $ carry เมื่อคุณไป
Progrock
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.