2010-03-01 10 views
39

एक मस्तिष्क को काफी मामूली समस्या से मुक्त करना। अगर मैं इस तरह की सरणी से शुरू करता हूं:मैं एक सरणी तत्व को PHP में किसी सरणी के अंत में ज्ञात कुंजी के साथ कैसे स्थानांतरित करूं?

$my_array = array(
        'monkey' => array(...), 
        'giraffe' => array(...), 
        'lion' => array(...) 
); 

... और नए तत्व अलग-अलग कुंजी के साथ जोड़े जा सकते हैं लेकिन हमेशा एक सरणी मान। अब मैं सुनिश्चित कर सकता हूं कि पहले तत्व में हमेशा 'बंदर' कुंजी होगी लेकिन मैं किसी भी अन्य कुंजी के बारे में सुनिश्चित नहीं हो सकता।

जब मैंने सरणी भरना समाप्त कर लिया है तो मैं अन्य तत्वों के क्रम को परेशान किए बिना ज्ञात तत्व 'बंदर' को सरणी के अंत में ले जाना चाहता हूं। ऐसा करने का सबसे प्रभावी तरीका क्या है?

हर तरह से मैं सोच सकता हूं कि थोड़ा सा गुंजाइश लगता है और मुझे लगता है कि मुझे कुछ स्पष्ट याद आ रही है।

उत्तर

67

एक ही तरीका है मैं यह करने के बारे में सोच सकते तो इसे हटाने के लिए इसे जोड़ने है:

$v = $my_array['monkey']; 
unset($my_array['monkey']); 
$my_array['monkey'] = $v; 
+3

हाँ यह शायद सबसे अच्छा तरीका है। मैं शायद इसके बारे में बहुत मुश्किल सोच रहा हूँ। – tamewhale

+0

यह अब PHP 7.1 में काम नहीं करता है, ऐसा लगता है कि –

+0

@RolandSeuhs वास्तव में PHP 7.1 में काम नहीं कर रहा है? ऐसा लगता है कि मेरे लिए ठीक काम करता है। – JonnieJS

7

array_shift शायद unsetting the index की तुलना में कम कुशल है, लेकिन यह काम करता है:

$my_array = array('monkey' => 1, 'giraffe' => 2, 'lion' => 3); 
$my_array['monkey'] = array_shift($my_array); 
print_r($my_array); 

एक अन्य विकल्प है कॉलबैक और uksort:

uksort($my_array, create_function('$x,$y','return ($y === "monkey") ? -1 : 1;')); 

यदि आप PHP5.3 + का उपयोग कर रहे हैं या फ़ंक्शन को वैश्विक फ़ंक्शन के रूप में नियमित रूप से परिभाषित करते हैं तो आप उचित lambda का उपयोग करना चाहेंगे।

+0

दोनों अच्छे जवाब। इस तरह का कुछ ऐसा था जो मुझे दिमाग में था लेकिन यह ओवरकिल की तरह लग रहा था। – tamewhale

+2

@tamewhale धन्यवाद। मैंने 24 जानवरों के साथ एक बहुत ही सतही बेंचमार्क किया और 'अनसेट' वास्तव में सबसे तेज़ है। यह 'array_shift' से 10 गुना तेज और' uksort' से 300 गुना तेज है। – Gordon

+0

एक लाइनर से प्यार करें - संभवतः सबसे कुशल नहीं है लेकिन ज्यादातर मामलों में यह कभी भी कोई फर्क नहीं पड़ता और 'array_shift()' दृष्टिकोण का लालित्य इसे साफ और पठनीय बनाता है। – billynoah

1

आप कुछ बुनियादी कैलकुंस को कार्यान्वित कर सकते हैं और एक स्थिति से दूसरी स्थिति में सरणी तत्व को स्थानांतरित करने के लिए सार्वभौमिक कार्य प्राप्त कर सकते हैं।

पीएचपी के लिए यह इस तरह दिखता है:

function magicFunction ($targetArray, $indexFrom, $indexTo) { 
    $targetElement = $targetArray[$indexFrom]; 
    $magicIncrement = ($indexTo - $indexFrom)/abs ($indexTo - $indexFrom); 

    for ($Element = $indexFrom; $Element != $indexTo; $Element += $magicIncrement){ 
     $targetArray[$Element] = $targetArray[$Element + $magicIncrement]; 
    } 

    $targetArray[$indexTo] = $targetElement; 
} 

चेक बाहर विस्तृत विवरण के लिए "gloommatter" पर "सरणी तत्वों आगे बढ़"।

http://www.gloommatter.com/DDesign/programming/moving-any-array-elements-universal-function.html

1

मैं वास्तव में की तरह @ के लिए यह एक एक लाइनर के रूप में लालित्य है, लेकिन यह केवल यदि कुंजी शुरुआत में है काम करता है ऊपर गॉर्डन जवाब। यहां एक और लाइनर है जो किसी भी स्थिति में कुंजी के लिए काम करेगा:

$arr = array('monkey' => 1, 'giraffe' => 2, 'lion' => 3); 
$arr += array_splice($arr,array_search('giraffe',array_keys($arr)),1); 
संबंधित मुद्दे