2012-09-10 11 views
19

सैद्धांतिक प्रश्न है कि शायद कोई समझ नहीं आता है, लेकिन शायद, एक चालाक जवाब है।PHP foreach जो केवल

मैं सरणी के माध्यम से पुन: प्रयास करना चाहता हूं और इसकी चाबियां और उनके साथ कुछ प्राप्त करना चाहता हूं। मैं क्या कर के एक त्वरित उदाहरण:

foreach($array as $key => $value) { 
    $other_array[$key] = 'something'; 
} 

अब, PHP Mess Detector चिल्लाती कि $value इस दायरे में अप्रयुक्त है। इसलिए मैं सोच रहा था कि शायद यह array के keys तक पहुंचने का सबसे अच्छा तरीका नहीं है।

किसी भी विचार कैसे अनावश्यक रूप से मेरी array से बाहर values बाहर निकाले बिना यह करने के लिए? क्या इसका कोई महत्वपूर्ण प्रदर्शन प्रभाव पड़ता है ... या शायद मैं सिर्फ पागल हो रहा हूं और बेवकूफ सवालों के साथ किसी के समय को बर्बाद किए बिना आगे बढ़ना चाहिए :)।

+0

यह सामान्य है। लेकिन यू इसका उपयोग कर सकता है: $ keys = array_key ($ array); foreach ($ कुंजी के रूप में $ कुंजी) { $ other_array [$ key] = 'कुछ'; } – Sergey

+0

आप इस तरह के उदाहरणों के लिए मैस डिटेक्टर की चेतावनियों को दबा सकते हैं: http://phpmd.org/documentation/suppress-warnings.html – wkm

उत्तर

37

आप इस

foreach(array_keys($array) as $key) { 
// do your stuff 
} 

की तरह कुछ उस से चाबी से मिलकर एक सरणी से अधिक foreach पुनरावृति होगा कर सकता है आपके वास्तविक सरणी के बजाय सरणी। ध्यान दें कि यह शायद प्रदर्शन दृष्टिकोण से बेहतर नहीं है।

+0

मेरा मानना ​​है कि array_keys() को प्रत्येक पुनरावृत्ति के लिए बुलाया जाएगा, तो शायद यह सबसे बुद्धिमान कदम नहीं है? –

+0

एक बार मूल्यांकन किए जाने वाले सरणी में जो सरणी है, उससे मुझे कोई याद नहीं है। बस * foreach (सरणी ("ए", "बी", "सी") $ अक्षरों के रूप में करने की तरह) * हर पुनरावृत्ति पर एक नई सरणी नहीं बनाता है। यदि यह गलत है तो निश्चित करें, foreach से पहले एक $ कुंजी चर बनाएँ ... क्या आपके पास इस तथ्य को इंगित करने वाला कोई संदर्भ है कि foreach प्रत्येक पुनरावृत्ति पर सरणी का मूल्यांकन करता है? – inquam

+2

जो मैं देख सकता हूं उससे फ़ोरैच() को इटरेटर्स का उपयोग करके कार्यान्वित किया जाता है और इस प्रकार केवल उस फ़ंक्शन को कॉल करता है जो एक बार एक सरणी देता है। फिर यह इटरेटर का उपयोग करता है जो प्रत्येक आइटम के साथ जारी रखने के लिए मौजूदा परिणाम सेट को इंगित करता है। तो यह * foreach (array_keys() ... * – inquam

5

हाँ, वहाँ यह करने के लिए एक तेज़ तरीका है: http://php.net/manual/en/function.array-keys.php

+0

+1 पैसे पर होने के लिए, लेकिन पूछताछ ने एक अच्छा उदाहरण दिया ताकि वह लूट पा सके;) – RandomWhiteTrash

+1

मुझे वास्तव में यकीन नहीं है कि प्रारंभिक सरणी (जो सरणी_की करता है) की कुंजी वाली एक नई सरणी बनाना * तेज * है। लेकिन यह कम से कम काम किया जाता है। – inquam

+0

मैंने बेंचमार्क नहीं किए हैं, लेकिन मुझे लगता है कि यह प्रश्नकर्ता के कोड से तेज़ है, जो एक नई सरणी भी बनाता है। array_keys() आंतरिक रूप से स्क्रिप्टिंग भाषा का उपयोग करने के बजाय आंतरिक रूप से एक अनुकूलित तरीके (मुझे उम्मीद है) में करता है। – LeJared

1

आप कुछ मूल्य के लिए सभी कुंजी सेट करना चाहते हैं तो आप इसे इस तरह से सिर्फ कर सकते हैं:

$array = array(
     'foo'=> 'oldval1', 
     'bar'=> 'oldval2', 
     'baz'=> 'oldval3' 
); 

$other_array = array_fill_keys(array_keys($array), 'something'); 
print_r($other_array); 

यह उत्पादन करेगा:

Array 
(
    [foo] => something 
    [bar] => something 
    [baz] => something 
) 
+0

+1 हालांकि यह मेरे मन में नहीं था - उदाहरण oversimplified था :)। वैसे भी धन्यवाद - कुछ नया सीखना :) – RandomWhiteTrash

5

बस इस संदेश को अनदेखा।

PHP में जिस तरह से आपने foreach का उपयोग किया सबसे तेज़ है। यह सही है, कि आपको अप्रयुक्त चर से बचना चाहिए, लेकिन इस मामले में आप कुछ प्रदर्शन खोए बिना इसे टालना नहीं कर सकते हैं।

उदा। foreach(array_keys($arr) as $key)foreach($arr as $key => $notUsed) से लगभग 50% से 60% धीमी
है।

phpmd का यह मुद्दा पहले से ही here पर रिपोर्ट किया गया है और पहले से ही पुल अनुरोध here है।

तक phpmd आप भी (मेरे मामले में लाइन 123) this little hack

उपयोग कर सकते हैं विधि collectVariables(..) में फ़ाइल /src/main/php/PHPMD/Rule/UnusedLocalVariable.php में

if ($this->isLocal($variable)) 

द्वारा

if ($this->isLocal($variable) && !($this->isChildOf($variable, 'ForeachStatement') && $variable->getName() === '$notUsed')) 

हो जाएगा ताकि बदलने के अद्यतन किया जाता है रिपोर्टिंग से पीपीएमडी को रोकें $notUsedकहीं भी एक फोर के अंदर एसी loops।

0

पाश थोड़ी देर में एक foreach से बचने के लिए।

$a = ['1','A','B','12','ui']; 

while(true) { sleep(1); 
    $b = next($a) ? current($a): reset($a); 
    echo key($a) , ':' , $b , PHP_EOL; 
} 
संबंधित मुद्दे