Array_filter () के बाद, मैं 0 से शुरू होने वाले संख्यात्मक क्रम में जाने के लिए कुंजियों को कैसे रीसेट कर सकता हूं


108

मैंने केवल एक सरणी से उन प्रविष्टियों को हटाने के लिए array_filter का उपयोग किया था जिनका केवल '' मूल्य था, और अब मैं 0 से शुरू होने वाले प्लेसहोल्डर के आधार पर उस पर कुछ परिवर्तन लागू करना चाहता हूं, लेकिन दुर्भाग्य से यह अभी भी मूल सूचकांक को बरकरार रखता है। मैंने थोड़ी देर तक देखा और कुछ भी नहीं देख सका, शायद मैं सिर्फ स्पष्ट याद किया, लेकिन मेरा सवाल है ...

मैं 0 पर शुरू करने और नई सरणी में क्रम में जाने के लिए आसानी से सरणी के अनुक्रमित को कैसे रीसेट कर सकता हूं, बजाय इसके कि पुराने सूचकांक को बनाए रखा है?



जब तक आप पूरी तरह से निश्चित नहीं होते हैं कि आपके सरणी में कोई खाली / शून्य-ईश / फाल्सी मूल्य नहीं है, मुझे आपसे आग्रह करना चाहिए कि आप इसका उपयोग न करें array_filter()- आप जितना चाहते हैं उससे अधिक शुद्ध कर सकते हैं। यहाँ एक डेमो के साथ कुछ स्पष्टीकरण दिया गया है: stackoverflow.com/a/43657056/2943403
मिकमैकुसा

जवाबों:


223

यदि आप array_valuesअपने एरे पर कॉल करते हैं, तो यह शून्य से रिइंडैक्स हो जाएगा।


लिंक अब काम नहीं करता है, इसके बजाय php.net/manual/en/function.array-values.php का उपयोग करें । मैं इसे अपडेट नहीं कर सकता, क्योंकि मुझे कम से कम 6 अक्षर बदलने की आवश्यकता है।
रासमस हैनसेन

37

यदि आप ऐरे फिल्टर का उपयोग कर रहे हैं तो निम्नानुसार करें

$NewArray = array_values(array_filter($OldArray));

3
ओह, जब मैंने यह जानने की कोशिश की है कि json_encode का परिणाम एक सरणी json_encode के एक array_filtered सरणी की तुलना में अलग क्यों है ...
थैंक यू सो मच

13

मुझे इस बात की चिंता है कि कितने प्रोग्रामर ने निर्दोष रूप array_values(array_filter())से अपने कोड में विधि को कॉपी / पेस्ट किया है - मुझे आश्चर्य है कि कितने प्रोग्रामर अनजाने में array_filter के लालच के कारण समस्याओं में भाग गए। या इससे भी बदतर, कितने लोगों ने कभी नहीं पाया कि फ़ंक्शन सरणी से बहुत सारे मूल्यों को शुद्ध करता है ...

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

हालांकि, सबसे पहले, यह बेहद महत्वपूर्ण है कि मैं लालची प्रकृति पर जोर देता हूं array_filter()और यह कैसे चुपचाप आपकी परियोजना को बंद कर सकता है। यहाँ इसमें मिश्रित मूल्यों के साथ एक सरणी है जो परेशानी को उजागर करेगा:

$array=['foo',NULL,'bar',0,false,null,'0',''];

अपरकेस / लोअरकेस की परवाह किए बिना अशक्त मान हटा दिए जाएंगे।

लेकिन जब हम array_values ​​() और array_filter () का उपयोग करते हैं तो सरणी में जो कुछ भी है उसे देखें :

array_values(array_filter($array));

आउटपुट सरणी ($ सरणी):

array (
  0 => 'foo',
  1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!

अब देखें कि आपको मेरे तरीके से क्या मिलता है जो array_walk () & का उपयोग करता है एक नया फ़िल्टर किया गया is_null () का

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});

यह आसान पढ़ने / समझाने के लिए कई लाइनों पर लिखा जा सकता है:

array_walk(                      // iterate each element of an input array
    $array,                      // this is the input array
    function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
        if(!is_null($v)){        // this literally checks for null values
            $filtered[]=$v;      // value is pushed into output with new indexes
        }
    }
);

आउटपुट सरणी ($ फ़िल्टर):

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => false,
  4 => '0',
  5 => '',
)

मेरी विधि के साथ आपको अपनी पुन: अनुक्रमित कुंजी, सभी गैर-शून्य मान, और कोई भी शून्य मान नहीं मिलता है। आपके सभी अशक्त-फ़िल्टरिंग आवश्यकताओं के लिए एक स्वच्छ, पोर्टेबल, विश्वसनीय वन-लाइनर। यहां है प्रदर्शन है



इसी तरह, यदि आप खाली, झूठे और अशक्त तत्वों (शून्य को बनाए रखना) को हटाना चाहते हैं, तो ये चार तरीके काम करेंगे:

var_export(array_values(array_diff($array,[''])));

या

var_export(array_values(array_diff($array,[null])));

या

var_export(array_values(array_diff($array,[false])));

या

var_export(array_values(array_filter($array,'strlen')));

आउटपुट:

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => '0',
)

अंत में, जो कोई भी भाषा निर्माण के सिंटैक्स को पसंद करता है, उसके लिए आप नए अनुक्रमणिकाओं को जारी करने के लिए एक नए सरणी में योग्यता मानों को धक्का दे सकते हैं।

$array=['foo', NULL, 'bar', 0, false, null, '0', ''];

$result = [];
foreach ($array as $value) {
    if (strlen($value)) {
        $result[] = $value;
    }
}

var_export($result);

2
यदि आप लिखते हैं तो क्या चीजें बिल्कुल अपेक्षित तरीके से व्यवहार नहीं करेंगी array_values(array_filter($arr, function($el) {return $el !== '';}))? ऐसा लगता है कि ओपी के बारे में पूछने का स्वाभाविक तरीका क्या है।
केसी

1
हाँ। मेरा कहना है कि डेवलपर्स को array_filter()तब तक डिफ़ॉल्ट व्यवहार का उपयोग करने से बचना चाहिए जब तक कि डेटा के उनके अंतरंग ज्ञान को साइड इफेक्ट के बिना लालची को छानने की अनुमति न दें। (आगे की सावधानी: empty()इसी तरह से व्यवहार करता है और इसके लालच में एक खाली सरणी भी शामिल है।)
मिकमैकुसा

2
यह उत्तर पूरी तरह से अलग प्रश्न का उत्तर देता है, किसी भी तरह से मूल से संबंधित नहीं है, आकार या रूप।
अरादमन

1
array_filter()ठीक उसी तरह व्यवहार करता है जैसे आप मैनुअल में जो कहते हैं उसके आधार पर अपेक्षा करते हैं: php.net/manual/en/function.array-filter.php "यदि कोई कॉलबैक की आपूर्ति नहीं की जाती है, तो FALSE के बराबर सरणी की सभी प्रविष्टियाँ (बूलियन में कनवर्ट करना देखें) ) हटा दिया जाएगा।" और PHP प्रोग्रामर के बीच यह सामान्य ज्ञान होना चाहिए कि बूलियन के लिए मजबूर होने पर 0, अशक्त, गलत, '' और '0' सभी झूठे का मूल्यांकन करते हैं।
मैडसेन

1
बात यह है, ज्यादातर लोगों को पता नहीं है कि क्या उम्मीद है। आप करते हैं, मैं करता हूं, लेकिन कई नहीं करते हैं। मैंने यह उत्तर उन लोगों की मदद करने के लिए पोस्ट किया है जो नहीं जानते हैं।
मिकमैकुसा

12

उपयोग करें array_values():

<?php

$array = array('foo', 'bar', 'baz');
$array = array_filter($array, function ($var) {
    return $var !== 'bar';
});

print_r($array); // indexes 0 and 2
print_r(array_values($array)); // indexes 0 and 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.