लूपिंग के बिना बहुआयामी सरणी में विशिष्ट "कुंजी" की एक सरणी कैसे प्राप्त करें


115

मान लें कि मेरे पास निम्नलिखित बहुआयामी सरणी है (MySQL या सेवा से पुनर्प्राप्त):

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

क्या हम idएक " बिल्ट-इन " php फ़ंक्शन कॉल में s की एक सरणी प्राप्त कर सकते हैं ? या कोड की एक पंक्ति?
मुझे पारंपरिक लूपिंग के बारे में पता है और मूल्य मिल रहा है, लेकिन मुझे इसकी आवश्यकता नहीं है:

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

शायद कुछ array_map()और call_user_func_array()जादू कर सकता है।


"क्या हम एक फ़ंक्शन कॉल में आईडी की एक सरणी प्राप्त कर सकते हैं?" हां, लेकिन आपको फ़ंक्शन लिखना होगा
:)

@ बोरिसग्यूरी, मेरा मतलब बिल्ट-इन फंक्शन्स :-)
ifaour

2
पुनश्च: मुझे पता है कि मैं foreach($users as $user) {$ids[] = $user['id'];}एक पंक्ति में लिख सकता हूँ ! लेकिन आप जानते हैं कि मेरा क्या मतलब है / आवश्यकता है :-)
ifaour

@ यूजीन, मुझे स्पष्ट रूप से अन्य चीजों के लिए सरणी की आवश्यकता है। और फिर, यह केवल PHP में मज़ेदार और नए शॉर्टहैंड सीखने के लिए है।
ifaour

जवाबों:


261

5.5 php के बाद से, आप उपयोग कर सकते हैं array_column:

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

यह किसी भी आधुनिक परियोजना पर पसंदीदा विकल्प है। हालाँकि, यदि आपको php> 5.5 का समर्थन करना चाहिए, तो निम्न विकल्प मौजूद हैं:

5.3 php के बाद से, आप 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'];}कुंजी का मूल्य वापस करने के समान है जो भयानक होगा! :-)
इपोर

1
ठीक है, यह "ऑल इन वन" फंक्शन नहीं है, लेकिन क्लोजर (एनिनोमेनिक फंक्शन्स) एक बहुत ही शक्तिशाली अवधारणा है, जिसका इस्तेमाल इस तरह की प्रोसेसिंग के लिए किया जा सकता है, आप यह जानना चाहेंगे कि उनका इस्तेमाल कैसे किया जाए।
बोरिस गुएरी

अगर मुझे चाबी भी मिलनी है तो क्या होगा? मान लीजिए: $ गिरफ्तारी = ['गेंद' => ['टोकरी' => ५]]; मैं प्राप्त करना चाहता हूं: $ बॉल = ['बॉल' => ५];
एंगर

2
@Angger तब आपके पास इस से अलग प्रश्न है। जब तक आप विस्तार से उल्लेख करते हैं कि आप क्या व्यवहार की उम्मीद करते हैं, तब तक यह पूछने के लिए स्वतंत्र महसूस करें कि उदाहरण के लिए इनपुट क्या है ['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]]
फ़िहाग

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 5.3.0 से शुरू होने वाले PHP में निर्दोष रूप से काम करेगा, यदि आपको इससे पहले समर्थन की आवश्यकता है, तो आपको उस wp_list_pluck को कॉपी करना होगा।

PHP <5.3

वर्डप्रेस 3.1+

वर्डप्रेस में एक फ़ंक्शन है जिसे wp_list_pluck कहा जाता है यदि आप वर्डप्रेस का उपयोग कर रहे हैं जो आपकी समस्या को हल करता है।

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

यह और ऊपर दिए गए सभी तरीके हालांकि पर्दे के पीछे लूप करते हैं;)


आपका पहला उदाहरण किसी सरणी को नहीं लौटाएगा, बस सरणी में $ उपयोगकर्ता ['नाम'] के लिए पाया गया अंतिम मान है। आपको $ कैरी करने के लिए पुश / अपेंड करना होगा और जाते समय $ कैरी वापस करना होगा।
प्रोग्रॉक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.