2013-10-14 7 views
5

आप किसी भी सरणी $ पी कि आप ऐसा तरह एक पाश में बसा है, तो:php में सहयोगी सरणी में मूल्य का सूचकांक खोजें?

$p[] = array("id"=>$id, "Name"=>$name); 

नाम कुंजी में जॉन के लिए खोज करने के लिए सबसे तेज़ तरीका क्या है, और अगर मिल गया, $ पी सूचकांक वापसी? $ पी के माध्यम से लूपिंग के अलावा कोई रास्ता है?

मेरे पास $ p में खोजने के लिए 5000 नाम हैं, और $ पी में संभावित रूप से 5000 पंक्तियां भी हो सकती हैं। वर्तमान में मैं प्रत्येक नाम की तलाश में $ p के माध्यम से लूप करता हूं, और यदि पाया जाता है, तो इसे पार्स करें (और इसे किसी अन्य सरणी में जोड़ें), $ p से पंक्ति को विभाजित करें, और 5000 नामों के आगे की खोज शुरू करने के लिए तैयार 1 को तोड़ दें।

मैं सोच रहा था कि क्या सूचकांक प्राप्त करने के बजाय सूचकांक प्राप्त करने का एक तेज़ तरीका है जैसे कि $ p के माध्यम से लूपिंग करना, उदाहरण के लिए एक जारी प्रकार?

एक लुक लड़कों के लिए धन्यवाद।

+0

कोई अन्य तरीका नहीं। आपको लूप करना है।PHP आंतरिक रूप से किसी भी हैशैप या मूल्यों के समान नहीं बनाए रखता है; बस चाबियों के लिए। (आप एक अतिरिक्त सरणी बना सकते हैं जो '$ q [$ p [$ key]] = $ key;' – bwoebi

+0

ओएमजी है यदि आप इतने बड़े डेटा में हेरफेर करने के लिए डेटाबेस का उपयोग नहीं कर सकते हैं, तो इससे कोई फर्क नहीं पड़ता –

+0

एकमात्र तरीका $ p में किसी नाम के प्रत्येक स्थान पर सभी नामों और एक इंडेक्स (या इंडेक्स के साथ सरणी नहीं है) के साथ एक और सहयोगी सरणी बनाना है, जिसे आपको $ p के साथ बनाए रखना चाहिए। – Tumtum

उत्तर

4

ठीक है, इसलिए मुझे यह समस्या दिखाई देती है, आपके पास अद्वितीय आईडी हैं, लेकिन नाम अद्वितीय नहीं हो सकते हैं।

आप के रूप में सरणी को प्रारंभ कर सकते हैं:

array($id=>$name); 

और अपनी खोजों की तरह हो सकता है:

array_search($name,$arr); 

यह भूसे के ढेर में सुई खोजने एक होगा की देशी पद्धति के रूप में बहुत अच्छी तरह से काम करेगा अपने कार्यान्वयन से बेहतर कार्यान्वयन।

उदा।

$id = 2; 
$name= 'Sunny'; 
$arr = array($id=>$name); 
echo array_search($name,$arr); 

गूँज 2

प्रमुख लाभ इस पद्धति में कोड पठनीयता होगा।

+1

धन्यवाद दोस्तों !!! मेरे पास कोड के साथ एक खेल होगा और देखें कि कौन सा समाधान सबसे अच्छा फिट बैठता है। – Shaun

+1

array_search() नौकरी कर रहा है! धन्यवाद सनी! – Shaun

1

यदि आप जानते हैं कि आपको उसी अनुरोध के भीतर इनमें से कई प्रकार की खोज करने की आवश्यकता होगी तो आप उनसे एक इंडेक्स सरणी बना सकते हैं। एक बार इंडेक्स बनाने के लिए आपको एक बार सरणी के माध्यम से लूप होगा।

$piName = array(); 
foreach ($p as $k=>$v) 
{ 
    $piName[$v['Name']] = $k; 
} 

आप प्रति पृष्ठ केवल एक या दो खोज करने के लिए की जरूरत है तो एक बाहरी डेटाबेस में सरणी चलती है, और वहाँ सूचकांक बनाने पर विचार करें।

+0

हालांकि यह पहली प्रविष्टि खोजने के लिए अच्छा लग रहा है (यह निश्चित रूप से इसी कुंजी होगी) - यह ओपी के अनुरोध को फिट नहीं करेगा अगर उसे स्रोत नाम में एकाधिक प्रविष्टियां रखने की आवश्यकता है, तो 'नाम' फ़ील्ड –

+0

यह * आखिरी * * वास्तव में प्रविष्टि, जो ओपी के वर्तमान एल्गोरिदम से अलग है (जो पहले पाता है)। –

+0

आह, हाँ, समझ गया। मेरा मुद्दा था - अगर इस तरह से स्रोत सरणी का पुनर्निर्माण करें, जाहिर है, यह कई मानों को खोने का एक कारण हो सकता है। तो इस संरचना को मूल के _instead_ का उपयोग नहीं किया जा सकता है, लेकिन इसका उपयोग _with_ किया जा सकता है। –

0
$index = 0; 
$search_for = 'John'; 
$result = array_reduce($p, function($r, $v) use (&$index, $search_for) { 
    if($v['Name'] == $search_for) { 
    $r[] = $index; 
    } 
    ++$index; 
    return $r; 
}); 

$ परिणाम $ पी में तत्वों जहां कुंजी Name साथ तत्व मूल्य John था की सभी सूचकांकों में शामिल होंगे। (बेशक यह केवल एक सरणी है कि संख्यानुसार 0 के साथ शुरुआत अनुक्रमित और कोई "छेद" सूचकांक में है के लिए काम करता है।)


संपादित करें: शायद और भी आसान सिर्फ array_filter उपयोग करने के लिए, लेकिन वह नहीं लौटेगा केवल सूचकांक, लेकिन सभी सरणी तत्व जहां Name के बराबर होती है John - लेकिन सूचकांक संरक्षित किया जाएगा:

$result2 = array_filter($p, function($elem) { 
    return $elem["Name"] == "John" ? true : false; 
}); 
var_dump($result2); 

क्या, बेहतर अपनी आवश्यकताओं सूट resp। कौन सा तेज़ हो सकता है, आपके लिए यह पता लगाना है।

संबंधित मुद्दे