2011-11-20 14 views
9

मेरे पास 4 मानों के साथ एक सरणी है। मैं दूसरी स्थिति में मान को हटाना चाहता हूं और उसके बाद शेष कुंजी की एक शिफ्ट नीचे होनी चाहिए।php का उपयोग करके सरणी में एक विशिष्ट कुंजी को कैसे हटाया जाए?

$b = array(123,456,789,123); 

2 की स्थिति में कुंजी निकालने से पहले:

सरणी ([0] => 123 [1] => 456 [2] => 789 [3] => 123)

बाद मैं शेष कुंजी चाहते हैं लापता कुंजी

सरणी ([0] => 123 [1] => 789 [2] => के अंतराल में भरने के लिए एक नीचे शिफ्ट करने के लिए 123)

मैंने विशिष्ट कुंजी पर unset() का उपयोग करने का प्रयास किया, लेकिन यह शेष कुंजी को स्थानांतरित नहीं करेगा। मैं php का उपयोग कर सरणी में एक विशिष्ट कुंजी कैसे हटा सकता हूं?

+0

[कुंजी द्वारा सरणी से लाइन को हटाने] के संभावित डुप्लिकेट (http: // stackoverflow .com/प्रश्न/1782041/निकालें-लाइन-से-सर-बाय-की) – hakre

उत्तर

6

आपको सरणी को फिर से कुंजी करने के लिए array_values($b) की आवश्यकता है ताकि कुंजी अनुक्रमिक और संख्यात्मक (0 से शुरू हो) हों।

निम्नलिखित चाल करना चाहिए:

$b = array(123,456,789,123); 
unset($b[1]); 
$b = array_values($b); 
echo "<pre>"; print_r($b); 
+0

+1: बस एक चेक जोड़ें: 'array_key_exists' अगर आप कभी भी इस गतिशील को बनाने की योजना बनाते हैं :) – Nonym

0

आप एक विशिष्ट स्थान पर एक सरणी से एक आइटम निकालना चाहते हैं, तो आप उस स्थिति के लिए कुंजी प्राप्त करें और फिर सेट किए बिना यह कर सकते हैं:

$b = array(123,456,789,123); 
$p = 2; 
$a = array_keys($b); 
if ($p < 0 || $p >= count($a)) 
{ 
    throw new RuntimeException(sprintf('Position %d does not exists.', $p)); 
} 
$k = $a[$p-1]; 
unset($b[$k]); 

यह किसी भी PHP सरणी के साथ काम करता है, भले ही जहां अनुक्रमण शुरू होता है या तारों के लिए स्ट्रिंग का उपयोग किया जाता है।

आप शेष सरणी अंकित करना चाहते हैं तो बस array_values का उपयोग करें:

$b = array_values($b); 

जो तुम एक शून्य आधारित, संख्यानुसार अनुक्रमित सरणी दे देंगे।

मूल सरणी के रूप में अच्छी तरह से एक शून्य आधारित, संख्यानुसार अनुक्रमित सरणी है (अपने प्रश्न के रूप में) हैं, तो आप कुंजी प्राप्त करने के बारे में हिस्सा छोड़ सकते हैं:

$b = array(123,456,789,123); 
$p = 2; 
if ($p < 0 || $p >= count($b)) 
{ 
    throw new RuntimeException(sprintf('Position %d does not exists.', $p)); 
} 
unset($b[$p-1]); 
$b = array_values($b); 

या सीधे array_splice जो के साथ सौदों का उपयोग कुंजी और फिर से अनुक्रमित सरणी के बजाय ऑफसेट (इनपुट में संख्यात्मक कुंजियों संरक्षित कर रहे हैं नहीं):

$b = array(123,456,789,123); 
$p = 2; 
if ($p < 0 || $p >= count($b)) 
{ 
    throw new RuntimeException(sprintf('Position %d does not exists.', $p)); 
} 
array_splice($b, $p-1, 1); 
1

कोई भी array_diff_key() के साथ एक विधि की पेशकश की है, इसलिए मैं पूर्णता के लिए होगा।

कोड:

var_export(array_values(array_diff_key($b,[1=>'']))); 

आउटपुट:

array (
    0 => 123, 
    1 => 789, 
    2 => 123, 
) 

इस विधि से न केवल एक एक लाइनर में अपेक्षित परिणाम प्रदान करता है, यह एक array_key_exists() शर्त के बिना उपयोग करने के लिए सुरक्षित है।

यह विधि एक चरण में कुंजी द्वारा कई तत्व निकासी को अनुमति देने की अतिरिक्त सुविधा भी प्रदान करती है। जेजेजे का समाधान यह भी अनुमति देता है, लेकिन केवल लगातार तत्वों के साथ। array_diff_key() सरणी में उनकी स्थिति के बावजूद चाबियाँ हटाने के लिए लचीलापन प्रदान करता है।

कोड 2 और 4 तत्वों को दूर करने के (कुंजी 1 और 3):

var_export(array_values(array_diff_key($b,[1=>'',3=>'']))); 

आउटपुट:

array (
    0 => 123, 
    1 => 789, 
) 
संबंधित मुद्दे

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