बेहतर कई सरणी तत्वों को परेशान करने का तरीका


84

यहां सौदा यह है कि मेरे पास 17 तत्वों के साथ एक सरणी है। मैं उन तत्वों को प्राप्त करना चाहता हूं जिनकी मुझे एक निश्चित समय के लिए आवश्यकता है और उन्हें सरणी से स्थायी रूप से हटा दें।

यहाँ कोड है:

$name = $post['name'];
$email = $post['email'];
$address = $post['address'];
$telephone = $post['telephone'];
$country = $post['country'];

unset($post['name']);
unset($post['email']);
unset($post['address']);
unset($post['telephone']);
unset($post['country']);

हां कोड बदसूरत है, को कोसने की जरूरत नहीं है। मैं इसे बेहतर कैसे बनाऊं?

जवाबों:


109

हटाने के लिए array_diff_key का उपयोग करें

$remove = ['telephone', 'country'];

array_diff_key($post, array_flip($remove));

यदि आप रखने के लिए कुंजियों की एक सरणी की आपूर्ति करना चाहते हैं, तो आप array_intersect_key का उपयोग कर सकते हैं।


6
समझ में नहीं आता है कि इस पद्धति को जीत के उत्तर के रूप में क्यों स्वीकार नहीं किया जाता है क्योंकि यह वास्तव में एक आकर्षण के रूप में काम करता है !!
एलेक्स

प्रतिभाशाली! अच्छा है। मुझे यह सरणी और परेशान करने वाले तत्वों पर लूपिंग के बजाय पसंद है।
लाइफ

1
स्मार्ट समाधान !!
MAZux

बड़े इनपुट सरणियों के लिए स्मार्ट लेकिन धीमी गति से। foreach unset बड़े इनपुट एरेज़ के साथ बहुत तेज़ लगता है और (कम से कम) अपेक्षाकृत कम संख्या में unset को।
7

101

ऐसा लगता है कि फ़ंक्शन आपके extract()लिए एक बेहतर उपकरण होगा जो आप करने की कोशिश कर रहे हैं (यह मानते हुए कि यह किसी सरणी से सभी कुंजी / मान निकाल रहा है और उन्हें उसी नाम के साथ चर में असाइन करें जो स्थानीय दायरे में कुंजी के रूप में हैं)। आपके द्वारा सामग्री निकालने के बाद, आप पूरी तरह से परेशान कर सकते हैं $post, यह मानते हुए कि आपके पास कुछ और नहीं था जो आप चाहते थे।

हालांकि, वास्तव में आपके प्रश्न का उत्तर देने के लिए, आप उन चाबियों का एक सरणी बना सकते हैं जिन्हें आप निकालना चाहते हैं और लूप के माध्यम से स्पष्ट रूप से उन्हें परेशान कर रहे हैं ...

$removeKeys = array('name', 'email');

foreach($removeKeys as $key) {
   unset($arr[$key]);
}

... या आप वैरिएबल को एक नए सरणी में इंगित कर सकते हैं, जिसमें कुंजी को हटा दिया गया है ...

$arr = array_diff_key($arr, array_flip($removeKeys));

... या सरणी सदस्यों के सभी पास unset()...

unset($arr['name'],  $arr['email']);

8
array_diff_key () एक अच्छा समाधान है। सोचा कि मैं जोड़ दूंगा कि आप array_intersect_key () का उपयोग कर सकते हैं, रिवर्स करने के लिए, केवल कुछ तत्वों को रखें
बैटफैडैड

1
मैं bbradley के साथ हूं - array_diff_key महान समाधान है
माइकल

संयोग से मैं सिर्फ इस बात से परेशान था। तब मुझे लगा कि कोई बेहतर उपाय हो सकता है। Google मुझे यहां ले गया। इसलिए मैंने array_diff_key की कोशिश की और यह पता चला कि यह बड़े इनपुट सरणियों के लिए foreach की तुलना में बहुत धीमा है (कम से कम जब unset की कुंजी की संख्या अपेक्षाकृत कम है।)।
7

47

एक और तरीका है जो बेहतर है तो उपरोक्त उदाहरण। स्रोत: http://php.net/manual/en/function.unset.php

संपूर्ण सरणी को पूरी तरह से लूप करने और उसकी सभी कुंजियों को अनसुना करने के बजाय, आप इसे एक बार ऐसा करने के लिए अनसेट कर सकते हैं:

उदाहरण सरणी:

$array = array("key1", "key2", "key3");

संपूर्ण सरणी के लिए:

unset($array);

अद्वितीय कुंजी के लिए:

unset($array["key1"]);

एक सरणी में कई कुंजियों के लिए:

unset($array["key1"], $array["key2"], $array["key3"] ....) and so on.

मुझे उम्मीद है कि यह आपके विकास में मदद करता है।


2

मैं समझता हूं कि यह प्रश्न पुराना है, लेकिन मुझे लगता है कि ऐसा करने का एक इष्टतम तरीका हो सकता है:

$vars = array('name', 'email', 'address', 'phone'); /* needed variables */
foreach ($vars as $var) {
    ${$var} = $_POST[$var]; /* create variable on-the-fly */
    unset($_POST[$var]); /* unset variable after use */
}

अब, आप कहीं से भी $ नाम, $ ईमेल, ... का उपयोग कर सकते हैं;

NB: अर्क () सुरक्षित नहीं है, इसलिए यह पूरी तरह से सवाल से बाहर है!


जिज्ञासा से बाहर - क्यों निकालने () सुरक्षित नहीं है?
श्रीजान मार्जानोविक


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