php - साहचर्य सरणी का संख्यात्मक सूचकांक प्राप्त करें


154

मेरे पास एक सहयोगी सरणी है और मुझे एक कुंजी की संख्यात्मक स्थिति खोजने की आवश्यकता है। मैं इसे खोजने के लिए मैन्युअल रूप से सरणी के माध्यम से लूप कर सकता हूं, लेकिन क्या PHP में एक बेहतर तरीका है?

$a = array(
  'blue'   => 'nice',
  'car'    => 'fast',
  'number' => 'none'
);

// echo (find numeric index of $a['car']); // output: 1

जवाबों:


273
echo array_search("car",array_keys($a));

5
क्या PHP एक साहचर्य सरणी के आदेश की गारंटी देता है?
केविन बर्क

7
@KevinBurke जब तक आप किसी प्रकार के फ़ंक्शन का उपयोग नहीं करते हैं, तब तक इसे फिर से ऑर्डर नहीं किया जाएगा। सुनिश्चित नहीं हैं कि आप किस प्रकार की गारंटी की तलाश कर रहे हैं, लेकिन यह जावास्क्रिप्ट मॉडल की तरह नहीं है जहां सहयोगी सरणियों के लिए कोई स्थिर आदेश नहीं है।
फोसको

6
"Array_keys" द्वारा दिए गए इंडेक्स मूल सरणी के इंडेक्स से जरूरी मेल नहीं खाएंगे। उदाहरण के लिए, यदि आपने "परेशान" या कई अन्य कार्यों का उपयोग करके सरणी को बदल दिया है, तो मूल सरणी के सूचकांक में एक अंतर छोड़ दिया जाएगा, लेकिन array_keys एक नया सरणी का उत्पादन करेगा।
SEFF

4
यह काम नहीं करता है यदि साहचर्य सरणी को मिलाया जाता है, क्योंकि array("val1", "val2", "car" => "val3")यह उत्पादन करेगा 0, जो गलत है ...
Xriuk



2

  $a = array(
      'blue' => 'nice',
      'car' => 'fast',
      'number' => 'none'
  );  
var_dump(array_search('car', array_keys($a)));
var_dump(array_search('blue', array_keys($a)));
var_dump(array_search('number', array_keys($a)));



2

जबकि फ़ॉस्को का जवाब गलत नहीं है, इस मामले पर विचार करने के लिए एक मामला है : मिश्रित सरणियां। कल्पना कीजिए कि मेरे पास एक सरणी है:

$a = array(
  "nice",
  "car" => "fast",
  "none"
);

अब, PHP इस तरह के सिंटैक्स की अनुमति देता है, लेकिन इसमें एक समस्या है: अगर मुझे फॉस्को का कोड मिलता है, 0 जो मेरे लिए गलत है, लेकिन ऐसा क्यों होता है?
क्योंकि स्ट्रिंग्स और पूर्णांकों के बीच तुलना करते समय PHP स्ट्रिंग्स को पूर्णांकों में परिवर्तित करता है (और यह मेरे विचार में थोथा बेवकूफ है), इसलिए जब array_search()सूचकांक की खोज होती है तो यह पहले बंद हो जाता है क्योंकि यह स्पष्ट रूप ("car" == 0) से सच है । सख्त मोड में
सेट array_search()करने से समस्या का समाधान नहीं होगा क्योंकि तब array_search("0", array_keys($a))भी यदि कोई ऐसा तत्व है जो इंडेक्स 0 के साथ मौजूद है तो भी गलत होगा।
इसलिए मेरा समाधान सिर्फ सभी अनुक्रमों array_keys()को तार से परिवर्तित करता है और फिर उनकी तुलना सही ढंग से करता है:

echo array_search("car", array_map("strval", array_keys($a)));

प्रिंट 1, जो सही है।

EDIT:
जैसा कि शॉन ने नीचे टिप्पणी में बताया है, यही बात इंडेक्स वैल्यू पर भी लागू होती है, यदि आप इस पर एक इंडेक्स इंडेक्स की खोज करते हैं:

$a = array(
  "foo" => "bar",
  "nice",
  "car" => "fast",
  "none"
);
$ind = 0;
echo array_search($ind, array_map("strval", array_keys($a)));

आप हमेशा प्राप्त करेंगे 0, जो गलत है, इसलिए इसका समाधान इंडेक्स को डालना होगा (यदि आप एक चर का उपयोग करते हैं) इस तरह से एक स्ट्रिंग के लिए:

$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));

1
वैरिएबल पास करते समय, आपको इसे एक स्ट्रिंग के रूप में भी डालना चाहिए, क्योंकि शून्य से एक साहचर्य सरणी में गुजरने का एक ही नकारात्मक प्रभाव होगा। उदाहरण के लिए: var_dump(array_search(0, array_map("strval", array_keys($a))));हमेशा के int (0)बजाय आउटपुट होगा bool (false)
शॉन कॉकरिल

@ShaunCockerill सही है! मेरे उत्तर को अपडेट किया, इस ओर इशारा करने के लिए धन्यवाद!
Xriuk

0

एक समाधान मैं के साथ आया था ... शायद थोसे Fosco के समाधान की तुलना में बहुत अक्षम है:

 protected function getFirstPosition(array$array, $content, $key = true) {

  $index = 0;
  if ($key) {
   foreach ($array as $key => $value) {
    if ($key == $content) {
     return $index;
    }
    $index++;
   }
  } else {
   foreach ($array as $key => $value) {
    if ($value == $content) {
     return $index;
    }
    $index++;
   }
  }
 }

2
हाँ, PHP में एक कारण के लिए हजारों अंतर्निहित कार्य हैं। ये आमतौर पर PHP कोड में लंबे रास्ते से लिखे गए समान तर्क की तुलना में बहुत तेज़ हैं।
बिल कार्विन

3
यह संभवत: इससे भी तेज है array_search, जो पहले छंटाई करता है और इसलिए यह धीमी गति से धीमा होता है।
अलसादेयर

आह, लेकिन अंतर्निहित कोड पहले से तैयार है, और खोज सबसे अधिक संभावना एक द्विआधारी खोज होगी (यह मानते हुए कि यह पहले आइटम सॉर्ट करता है)।
SEFF

0

Array_keys पर आधारित सभी समाधान मिश्रित सरणियों के लिए काम नहीं करते हैं। समाधान सरल है:

echo array_search($needle,array_keys($haystack), true);

Php.net से: यदि तीसरा पैरामीटर सख्त TRUE पर सेट है, तो array_search () फ़ंक्शन हैस्टैक में समान तत्वों की खोज करेगा। इसका मतलब यह है कि यह हाइस्टैक में सुई की एक सख्त प्रकार की तुलना भी करेगा, और वस्तुओं का एक ही उदाहरण होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.