PHP सरणी के मानों को खाली करने का सबसे अच्छा तरीका है


172

किसी सरणी में सभी मानों को साफ़ करने के लिए कौन अधिक कुशल है? पहले वाले को मुझे दूसरे उदाहरण के लूप में हर बार उस फ़ंक्शन का उपयोग करने की आवश्यकता होगी।

foreach ($array as $i => $value) {
    unset($array[$i]);
}

या यह

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}

5
इसमें गलत क्या है unset($array)?
ब्लेक

13
चर को हटाता है।
el_pup_le

2
हाँ, लेकिन आप एक अशक्त सरणी का मूल्यांकन क्यों करना चाहेंगे जो आपने उस तरह से निर्धारित किया है?
ब्लेक

3
स्रोत? मेमोरी में कोई भी वैरिएबल ऐसा नहीं लगता है कि यह वैर से छोटा होगा।
ब्लेक

जवाबों:


256

जैसे ज़ैक ने कहा कि नीचे दी गई टिप्पणियों में आप इसका उपयोग करके बस फिर से इंस्टेंट करने में सक्षम हैं

$foo = array(); // $foo is still here

यदि आप चाहते हैं कि कुछ और अधिक शक्तिशाली उपयोग परेशान हो जाए, क्योंकि यह प्रतीक तालिका से $ foo को भी साफ कर देगा, यदि आपको बाद में इसे तुरंत फिर से लिखने की आवश्यकता है।

unset($foo); // $foo is gone
$foo = array(); // $foo is here again

63
क्यों नहीं इसे फिर से तुरंत के रूप में $foo = array();?
ज़ैक ज़तकिन-गोल्ड

2
@NishamMahsin या तो उपयोग करें global $foo; unset($foo);याunset($GLOBALS['foo']);
एरिक

7
@vivoconunxino मैंने इसे इस तरह से लिखा है क्योंकि लेखक सवाल करते हैं "PHP सरणी के मूल्यों को स्पष्ट करने का सबसे अच्छा तरीका"। यह 'स्पष्ट' है, न कि 'नई मिसाल'। उपयोग करना प्रतीक तालिका से unsetस्पष्ट होगा $foo। मैं हम बहुत बड़ी तालिकाओं के बारे में बात कर रहे हैं जो शायद मैं सुझाऊँगा $foo = null; unset($foo);क्योंकि यह भी स्मृति को थोड़ा बेहतर होगा। यह व्यवहार (GC) हालांकि बहुत स्थिर नहीं है और PHP संस्करणों पर बदल सकता है।
एरिक हेर्लिट्ज़

5
unset () कभी-कभी बहुत खराब होता है और परेशानी का कारण बन सकता है, अगर आप इसका गलत इस्तेमाल करते हैं। यह ओपी उत्तर का सही उत्तर नहीं देता है। न जाने क्यों उन्होंने इसे सर्वश्रेष्ठ उत्तर के रूप में स्वीकार किया, अपने ही सवाल पर उनकी टिप्पणी कहती है कि परेशान होने वाली समस्या यह चर को हटा देती है। जो समस्याओं इस समाधान का कारण बनता है देखने के लिए, मेरा उत्तर पर एक नज़र यहाँ
वुल्फस्लेवेट

2
सभी का समर्थन करने के लिए $foo = array();: वास्तव में इसमें एक वैचारिक समस्या हो सकती है: किसी संरचना को फिर से तैयार करना उसे खाली करने के समान नहीं है। स्मृति के साथ काम करते समय आप जानते हैं कि यह समान नहीं है क्योंकि आवंटन धीमा है। इसलिए, उपयोग में आसानी के बावजूद, पुन: तात्कालिकता इस प्रश्न का उत्तर नहीं हो सकता है, खासकर अगर किसी को इसे बहुत बार और जल्दी से करने की आवश्यकता होती है। यह काम कर सकता है, लेकिन यह PHP मेमोरी मैनेजमेंट, IMO पर बहुत अधिक निर्भर करेगा।
टेकनिक्विस्ट

82

यदि आप किसी वैरिएबल को एक खाली सरणी में रीसेट करना चाहते हैं, तो आप बस इसे पुन: व्यवस्थित कर सकते हैं:

$foo = array();

ध्यान दें कि यह इसके लिए किसी भी संदर्भ को बनाए रखेगा:

$foo = array(1,2,3);
$bar = &$foo;
// ...
$foo = array(); // clear array
var_dump($bar); // array(0) { } -- bar was cleared too!

यदि आप इसके किसी भी संदर्भ को तोड़ना चाहते हैं, तो पहले इसे अनसेट करें:

$foo = array(1,2,3);
$bar = &$foo;
// ...
unset($foo); // break references
$foo = array(); // re-initialize to empty array
var_dump($bar); // array(3) { 1, 2, 3 } -- $bar is unchanged

3
मुझे लगता है कि यह सबसे अच्छा जवाब है। स्वीकार किया जाना चाहिए। यह सबसे सरल तरीका दिखाता है और यह भी बताता है कि क्यों और कब unsetइस्तेमाल किया जाना चाहिए। +1

यह मेरा कोड है: justpaste.it/1gt46 । मैं चर में एक से अधिक आईडी कैसे घोषित कर सकता हूं। एकल मूल्य घोषणा है: $ productId = 19; मैं $ productId = में एक से अधिक मूल्य कैसे घोषित कर सकता हूं?
रत्न

@Rathinam यकीन नहीं है कि एक सरणी समाशोधन के साथ क्या करना है। कृपया Stackoverflow पर एक नया प्रश्न पोस्ट करें, और अपने कोड को सीधे प्रश्न में पेस्ट करें।
17

32

अफसोस की बात है कि मैं अन्य सवालों के जवाब नहीं दे सकता, पर्याप्त प्रतिष्ठा नहीं है, लेकिन मुझे कुछ ऐसा कहना होगा जो मेरे लिए बहुत महत्वपूर्ण था, और मुझे लगता है कि यह अन्य लोगों की भी मदद करेगा।

जब तक आपको मूल सरणी के संदर्भ की आवश्यकता न हो , तब तक चर को बंद करना एक अच्छा तरीका है !

यह स्पष्ट करने के लिए कि मेरा क्या मतलब है: यदि आपके पास एक फ़ंक्शन है जो ऐरे के संदर्भ का उपयोग करता है, उदाहरण के लिए एक सॉर्टिंग फ़ंक्शन जैसे

function special_sort_my_array(&$array)
{
    $temporary_list = create_assoziative_special_list_out_of_array($array);

    sort_my_list($temporary_list);

    unset($array);
    foreach($temporary_list as $k => $v)
    {
        $array[$k] = $v;
    }
}

यह काम नहीं कर रहा है! यहां सावधान रहें, unsetसंदर्भ को हटा देता है, इसलिए चर $arrayफिर से बनाया गया है और सही ढंग से भरा गया है, लेकिन फ़ंक्शन के बाहर से मान सुलभ नहीं हैं।

इसलिए यदि आपके पास संदर्भ हैं, तो आपको $array = array()इसके बजाय उपयोग करने की आवश्यकता है unset, भले ही यह कम स्वच्छ और समझने योग्य हो।


3
इसका उत्तर होना चाहिए - ओपी का कहना है कि स्पष्ट ऐरे वैल्यूज़ हैं, न कि पूरे ऐरे वेरिएबल को डी-रेफरेंस करें।
रॉस

13

अगर सरणी साहचर्य है तो मैं सबसे पहले कहूंगा। यदि नहीं, तो एक forलूप का उपयोग करें :

for ($i = 0; $i < count($array); $i++) { unset($array[$i]); }

यद्यपि यदि संभव हो तो, उपयोग करना

$array = array();

सरणी को खाली सरणी में रीसेट करने के लिए बेहतर है।





2

मैंने सरणी को खाली करने के लिए unset () का उपयोग किया है, लेकिन मुझे पता चला है कि unset () सरणी नल को प्रस्तुत करेगा इसलिए उदाहरण के लिए सरणी को फिर से घोषित करने की आवश्यकता है

<?php 
    $arr = array();
    array_push($arr , "foo");
    unset($arr); // this will set the array to null hence you need the line below or redeclaring it.
    $arr  = array();

    // do what ever you want here
?>

1

मुझे लगता है कि यह प्रश्न वास्तविक रूप से पुराना है, लेकिन उस समस्या के लिए मैंने एक सरणी में सभी मूल्यों को परेशान करने के लिए एक पुनरावर्ती कार्य लिखा। पुनरावर्ती क्योंकि इसका संभव है कि दिए गए सरणी से मान भी एक सरणी हो। तो यह मेरे लिए काम करता है:

function empty_array(& $complete_array) {
    foreach($complete_array as $ckey => $cvalue)
    {
        if (!is_array($cvalue)) {
            $complete_array[$ckey] = "";
        } else {
            empty_array( $complete_array[$ckey]);
        }

    }
    return $complete_array;

}

तो इसके साथ मुझे सभी कुंजियों और उप-सरणियों के साथ सरणी मिलती है, लेकिन रिक्त मान।


1

शायद सरल, आर्थिक तरीका (उपयोग करने के लिए कम संकेत) ...

$array = [];

हम php मैनुअल में पढ़ सकते हैं:

PHP 5.4 के रूप में आप शॉर्ट ऐरे सिंटैक्स का भी उपयोग कर सकते हैं, जो एरी [] के साथ एरे () को बदलता है।


आपको इसे भी समझाना चाहिए।
कुलश्रेष्ठ K

0

सेट नहीं समारोह उपयोगी जब कचरा कलेक्टर अपने दौर, जबकि एक लंच ब्रेक होने नहीं कर रहा है है,

हालाँकि unset फंक्शन केवल डेटा के वेरिएबल रेफरेंस को नष्ट कर देता है, डेटा अभी भी मेमोरी में मौजूद है और PHP मैमोरी को देखता है क्योंकि इसके पास कोई पॉइंटर नहीं है।

समाधान:null डेटा को खाली करने के लिए अपने चर को असाइन करें , कम से कम जब तक कचरा संग्रहकर्ता को पकड़ न ले।

$var = null;

और फिर इसे उसी तरह से परेशान करें!

unset($var);

4
यह सही नहीं लगता। मुझे नहीं लगता कि इसे स्थापित करना nullतत्काल कचरा संग्रह को मजबूर करेगा। क्या आपके पास इसके लिए कोई संदर्भ है?
म्पेन

@mpen क्या आप सहमत हैं कि असाइनमेंट इस उदाहरण में चर NULLके स्थान पर संग्रहीत मान को बदल देगा $var?
एंथनी रुतलेज

1
@AnthonyRutledge नहीं, मैं नहीं। मुझे पता है कि सभी के लिए, PHP केवल $varकुछ वैश्विक NULLऑब्जेक्ट को इंगित करने के लिए अपडेट करेगा और $varजब तक यह कचरा एकत्र नहीं होता है, तब तक डेटा को अकेला छोड़ देगा । दुभाषिया को उस डेटा को तुरंत अधिलेखित करने के लिए क्यों मजबूर किया जाएगा?
प्रातः

@mpen यह एक अच्छा सवाल है, लेकिन उस दुनिया में कम से कम सब कुछ एकत्र होने के लिए तैयार है।
एन्थोनी रटलेज

वास्तव में। बिंदु यह है कि मुझे संदेह है कि इसे
परेशान

-1

यह शक्तिशाली और परीक्षण किया गया अनसेट ($ gradearray) है; // सरणी को फिर से सेट करें


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