खाली सरणी तत्व निकालें


783

मेरे सरणी में कुछ तत्व उपयोगकर्ता द्वारा प्रस्तुत की गई बातों के आधार पर रिक्त तार हैं। मुझे उन तत्वों को हटाने की जरूरत है। मेरे पास यह है:

foreach($linksArray as $link)
{
    if($link == '')
    {
        unset($link);
    }
}
print_r($linksArray);

लेकिन यह काम नहीं करता है। $linksArrayअभी भी खाली तत्व हैं। मैंने इसे empty()फंक्शन के साथ करने की भी कोशिश की है, लेकिन नतीजा वही है।


1
मुझे लगा कि यह ध्यान देने योग्य है कि ऊपर दिया गया कोड काम नहीं करता है क्योंकि unset (...) फॉरेस्ट लूप द्वारा बनाए गए वैरिएबल पर काम करता है, न कि मूल ऐरे से जो जाहिर है कि लूप से पहले था।
बचाया

अगर (खाली ($ लिंक)) {गूंज $ लिंक; } यह मेरे लिए काम करता है
Shiplu

यू एक $ लिंक को बदल रहे हैं जिसका पुन: सत्यापन नहीं किया गया है! foreach का उपयोग करें ($ linksArray as $ key => $ link) unset (linksArray [$ key])
TD_Nijboer

जवाबों:


1547

जैसा कि आप स्ट्रिंग्स की एक सरणी के साथ काम कर रहे हैं, आप बस उपयोग कर सकते हैं array_filter(), जो आपके लिए यह सब आसानी से संभालता है:

print_r(array_filter($linksArray));

ध्यान रखें कि यदि कॉलबैक की आपूर्ति नहीं की गई है , तो FALSE( बूलियन में कनवर्ट करना ) के बराबर सरणी की सभी प्रविष्टियों को हटा दिया जाएगा। इसलिए यदि आपको उन तत्वों को संरक्षित करने की आवश्यकता है जो सटीक स्ट्रिंग हैं '0', तो आपको एक कस्टम कॉलबैक की आवश्यकता होगी:

// PHP 7.4 and later
print_r(array_filter($linksArray, fn($value) => !is_null($value) && $value !== ''));

// PHP 5.3 and later
print_r(array_filter($linksArray, function($value) { return !is_null($value) && $value !== ''; }));

// PHP < 5.3
print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));

16
array_filterखाली तत्वों को निकालना चाहिए। और अगर PHP की खाली की परिभाषा आपकी परिभाषा के समान नहीं है, तो आप कॉलबैक विकल्प को एक गुमनाम फ़ंक्शन के साथ भर सकते हैं जो अवांछित तत्वों को बाहर फेंक देता है। जाहिर तौर पर आपके पास अनाम कॉल बैक का उपयोग करने के लिए php 5.3 या बाद का होना चाहिए। stackoverflow.com/questions/2412299/…
बटलर बटुक

76
व्यू आउट array_filter does not reindex array indexes (कथन के लिए प्रॉसेस एरे का उपयोग करने में समस्या हो सकती है)। इसलिए इसे array_values ​​फ़ंक्शन के साथ लपेटें।
मिशाल - वेर्डा-नेट

8
उत्तर गलत है, क्योंकि यह falseतत्वों को भी हटा देगा । ( php.net/manual/en/function.array-filter.php )
pliashkou

5
@Deji क्या आपने फ़िल्टर करने से पहले उस सरणी को प्रिंट करने की कोशिश की है? मुझे लगता है aकि दूसरी बार बस सेट करना पहले वाले को रीसेट करता है।
कुल्लूब

5
@Cranio: जो पहले से ही एक और टिप्पणी द्वारा कवर किया गया है। यह गलत नहीं है, लेकिन शायद आपकी आवश्यकताओं से अधिक व्यापक है । इसका मतलब यह नहीं है कि अन्य लोगों को यह अभी भी उपयोगी नहीं मिल सकता है; सब के बाद, यदि आपके पास सभी अपने स्ट्रिंग में हैं, तो यह उत्तर केवल खाली लोगों को हटा देगा।
मार्टिन पीटर्स

169

आप array_filterखाली तत्वों को निकालने के लिए उपयोग कर सकते हैं :

$emptyRemoved = array_filter($linksArray);

यदि आपके पास (int) 0आपकी सरणी है, तो आप निम्नलिखित का उपयोग कर सकते हैं:

$emptyRemoved = remove_empty($linksArray);

function remove_empty($array) {
  return array_filter($array, '_remove_empty_internal');
}

function _remove_empty_internal($value) {
  return !empty($value) || $value === 0;
}

संपादित करें: हो सकता है कि आपके तत्व प्रति से खाली न हों लेकिन उनमें एक या अधिक रिक्त स्थान हों ... उपयोग करने से पहले आप निम्नलिखित का उपयोग कर सकते हैंarray_filter

$trimmedArray = array_map('trim', $linksArray);

10
मैंने अभी इसे बोल्टक्लॉक द्वारा स्वीकृत उत्तर में जोड़ा है, आप "0" समस्या से बचने के लिए array_filter ($ foo, 'strlen') कर सकते हैं और केवल शून्य लंबाई वाले लोगों को हटा सकते हैं।
एबी कैरोल

2
@nezZario: मान लें कि आपके पास केवल scalarआपके ऐरे में आइटम हैं। अन्यथा, आप ऐसा नहीं कर सकते।
एंड्रयू मूर

2
Php के लिए लैम्ब्डा का प्रयोग> = 5.3function remove_empty($array) { return array_filter($array, function($value){return !empty($value) || $value === 0;}); }
वायरल

1
array_map()क्या मैजिक कॉस मेरे पास उन खाली सरणियों में रिक्त स्थान था!
Prodigy

126

इस विषय पर सबसे लोकप्रिय जवाब बिल्कुल INCORRECT है।

निम्नलिखित PHP स्क्रिप्ट पर विचार करें:

<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));

ऐसा क्यों है? क्योंकि एक एकल '0' वर्ण वाला स्ट्रिंग भी बूलियन असत्य का मूल्यांकन करता है, इसलिए भले ही यह एक खाली स्ट्रिंग नहीं है, फिर भी यह फ़िल्टर्ड हो जाएगा। यह एक बग होगा।

फ़िल्टरिंग फ़ंक्शन के रूप में अंतर्निहित स्ट्रलेन फ़ंक्शन को पास करना, क्योंकि यह एक गैर-शून्य पूर्णांक को गैर-रिक्त स्ट्रिंग, और शून्य स्ट्रिंगर को एक रिक्त स्ट्रिंग के लिए लौटाता है। गैर-शून्य पूर्णांक हमेशा बूलियन में परिवर्तित होने पर सही का मूल्यांकन करते हैं, जबकि शून्य पूर्णांक बूलियन में परिवर्तित होने पर हमेशा गलत का मूल्यांकन करते हैं।

तो, पूर्ण, निश्चित, सही उत्तर है:

$arr = array_filter($arr, 'strlen');

3
माना। यह स्वीकृत उत्तर होना चाहिए, जिनके सरणी में तार हैं
mwieczorek

2
Upvoted। दूसरों में से कई की तुलना में बेहतर उत्तर, हालांकि यह ध्यान दिया जाना चाहिए कि वर्तमान में स्वीकृत उत्तर तकनीकी रूप से गलत नहीं है क्योंकि "रिक्त" वास्तव में PHP के भीतर विशेष अर्थ रखता है। (कुछ मानों के रूप में योग्य "खाली": 0, "", null)
rinogo

5
वे गलत नहीं हैं, यह सब संदर्भ के बारे में है। कुछ मामलों में मान को संरक्षित करना 0 महत्वपूर्ण हो सकता है। तो कृपया, यह मत कहिए कि हर कोई आपके सिवाय गलत है
Macr1408

6
यह टूट जाता है यदि सरणी में एक और सरणी होती है:strlen() expects parameter 1 to be string, array given
hpaknia

आप कह सकते हैं कि यह किसी के वांछित कार्यों को प्राप्त करने के लिए एक अच्छा दृष्टिकोण (दूसरों को गलत कहने के बजाय) हो सकता है। आमतौर पर सभी मामले समान नहीं होते हैं। हालांकि, यह दृष्टिकोण मेरे मामले के लिए काम कर रहा है।
MR_AMDEV

102
$linksArray = array_filter($linksArray);

"यदि कॉलबैक की आपूर्ति नहीं की जाती है, तो FALSE के बराबर इनपुट की सभी प्रविष्टियाँ हटा दी जाएंगी।" - http://php.net/manual/en/function.array-filter.php


4
मैंने Google की समस्या के बाद भी यह कोशिश की। दुर्भाग्य से, यह मेरे लिए रिक्त तत्वों में निकल जाता है।
विल

18
यह
OIS

2
@Will: क्या आपको यकीन है? यह खाली तारों को भी हटाता है, मैंने सफलतापूर्वक इसका परीक्षण किया। हो सकता है कि आपके इनपुट मानों में रिक्त स्थान हों और उन्हें पहले ही ट्रिम कर दिया जाना चाहिए। के अनुसार बूलियन जैसे रूपांतरण नियम रिक्त स्ट्रिंग गलत पर मूल्यांकन किया जाता है और इसलिए array_filter द्वारा हटा दिया।
acme


42

आप बस कर सकते हैं

array_filter($array)

array_filter: "यदि कॉलबैक की आपूर्ति नहीं की जाती है, तो FALSE के बराबर इनपुट की सभी प्रविष्टियां हटा दी जाएंगी।" इसका अर्थ है कि NULL, 0, '0', '', FALSE, सरणी () के मान वाले तत्व भी हटा दिए जाएंगे।

दूसरा विकल्प कर रहा है

array_diff($array, array(''))

जो NULL, '' और FALSE मान वाले तत्वों को हटा देगा।

उम्मीद है की यह मदद करेगा :)

अपडेट करें

यहाँ एक उदाहरण है।

$a = array(0, '0', NULL, FALSE, '', array());

var_dump(array_filter($a));
// array()

var_dump(array_diff($a, array(0))) // 0 / '0'
// array(NULL, FALSE, '', array());

var_dump(array_diff($a, array(NULL))) // NULL / FALSE / ''
// array(0, '0', array())

सारांश में:

  • 0 या '0' 0 हटा देगा और '0'
  • NULL, FALSE या '' NULL, FALSE और '' को हटा देगा

36
foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 

4
एक संक्षिप्त, पठनीय और सुरक्षित समाधान जो दूर नहीं करता है falseऔर 0। यह देखते हुए कि स्वीकृत उत्तर (जो असुरक्षित और गलत है) के रूप में उसी मिनट पोस्ट किया गया था , मैं स्वीकार किए गए उत्तर के 649 की तुलना में केवल आपके 8 अपवोट्स को मान सकता हूं जो बाद में एक-लाइन समाधान है।
rybo111

@ rybo111 - संभवतः, हालांकि कॉलबैक में उस तर्क का उपयोग array_filter()करना foreach()लूप की तुलना में एक क्लीनर दृष्टिकोण होगा
मार्क बेकर

शायद जल्दी, लेकिन आपका समाधान सबसे पठनीय है, जो महत्वपूर्ण है। आपके समाधान की आवश्यकता का उपयोग करने वालों के लिए trim(), मैं सिफारिश if(is_string($link) && trim($link) === '')
करूंगा

33

आपके सरणी से खाली ("खाली स्ट्रिंग) तत्वों को हटाने के लिए एक और एक लाइनर।

$array = array_filter($array, function($a) {return $a !== "";});

ध्यान दें: यह कोड जानबूझ कर रखता है null, 0और falseतत्वों।


या हो सकता है कि आप अपने सरणी तत्वों को पहले ट्रिम करना चाहते हैं:

$array = array_filter($array, function($a) {
    return trim($a) !== "";
});

नोट: यह कोड भी हटाता है nullऔर falseतत्वों को।


3
बिल्कुल वही जो मैंने किया, और यह पुराने PHPs के साथ भी संगत है , धन्यवाद! ;-)
स्टेनो जूल

1
@ जॉन्क गलत। ऐसा करने के लिए उपयोगकर्ता की तरह कॉलबैक की आवश्यकता है, जब तक कि आप एल्जो जीरो और अन्य गलत मूल्यों को दूर नहीं करना चाहते हैं।
क्रैनियो

ओह ... यह बिल्कुल प्यारा है। स्वीकार किया जाना चाहिए।
हेनरिक पीटरसन

20

संक्षेप में:

यह मेरा सुझाया गया कोड है:

$myarray =  array_values(array_filter(array_map('trim', $myarray), 'strlen'));

स्पष्टीकरण:

मुझे लगता है कि उपयोग array_filterअच्छा है, लेकिन पर्याप्त नहीं है, क्योंकि मूल्यों की तरह है spaceऔर \n... सरणी में रखें और यह आमतौर पर खराब है।

तो मैं सुझाव है कि आप मिश्रण का उपयोग array_filterऔर array_map

array_mapट्रिमिंग के लिए है, array_filterखाली मूल्यों को हटाने के लिए है, मान strlenरखने के लिए है 0, और array_valuesयदि आवश्यक हो तो पुन: अनुक्रमण के लिए है।

नमूने:

$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");

// "\r", "\n", "\r\n", " ", "a"
$new1 = array_filter($myarray);

// "a"
$new2 = array_filter(array_map('trim', $myarray));

// "0", "a"
$new3 = array_filter(array_map('trim', $myarray), 'strlen');

// "0", "a" (reindex)
$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));

var_dump($new1, $new2, $new3, $new4);

परिणाम:

array(5) {
  [0]=>
" string(1) "
  [1]=>
  string(1) "
"
  [2]=>
  string(2) "
"
  [4]=>
  string(1) " "
  [6]=>
  string(1) "a"
}
array(1) {
  [6]=>
  string(1) "a"
}
array(2) {
  [5]=>
  string(1) "0"
  [6]=>
  string(1) "a"
}
array(2) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "a"
}

ऑनलाइन टेस्ट:

http://phpio.net/s/5yg0


13

यदि आप एक संख्यात्मक सरणी के साथ काम कर रहे हैं और खाली तत्वों को हटाने के बाद सरणी को फिर से अनुक्रमित करने की आवश्यकता है, तो array_values फ़ंक्शन का उपयोग करें :

array_values(array_filter($array));

यह भी देखें: PHP reindex सरणी?


12

सबसे अधिक मत दिया गया उत्तर गलत है या कम से कम पूरी तरह से सच नहीं है क्योंकि ओपी केवल खाली तारों के बारे में बात कर रहा है। यहाँ एक पूरी तरह से व्याख्या है:

खाली का क्या मतलब है?

सबसे पहले, हमें इस बात पर सहमत होना चाहिए कि खाली साधनों का क्या मतलब है। क्या आपका मतलब फ़िल्टर करना है:

  1. रिक्त स्ट्रिंग केवल ( "")?
  2. सख्ती से झूठी मान? ( $element === false)
  3. falsey मूल्यों? (अर्थात 0, 0.0, "", "0", NULL, सरणी () ...)
  4. PHP के empty()कार्य के बराबर ?

आप मूल्यों को कैसे फ़िल्टर करते हैं

केवल खाली तारों को छानने के लिए :

$filtered = array_diff($originalArray, array(""));

केवल कड़ाई से झूठे मूल्यों को फ़िल्टर करने के लिए , आपको कॉलबैक फ़ंक्शन का उपयोग करना होगा :

$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
    return $var === false;
}

कॉलबैक किसी भी संयोजन के लिए भी उपयोगी है जिसमें आप कुछ को छोड़कर, "फाल्सी" मूल्यों को फ़िल्टर करना चाहते हैं। (उदाहरण के लिए, प्रत्येक को फ़िल्टर करें nullऔर false, आदि, केवल छोड़कर 0):

$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
    return ($var === 0 || $var === '0');
}

तीसरा और चौथा मामला समतुल्य (हमारे उद्देश्यों के लिए) समतुल्य है, और इसके लिए आपको जो भी उपयोग करना है वह डिफ़ॉल्ट है:

$filtered = array_filter($originalArray);

2
यदि आप बाहर निकालना चाहते हैं nullऔर false0 छोड़ते हैं, तो आप strlenअपने कॉलबैक के रूप में php के अंतर्निहित फ़ंक्शन का भी उपयोग कर सकते हैं ।
कुल्लूब

10

(स्ट्रिंग) 0 की एक सरणी मान रखने के लिए मुझे ऐसा करना पड़ा

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});


9

बहुआयामी सरणी के लिए

$data = array_map('array_filter', $data);
$data = array_filter($data);



7

मैं एक सरणी से खाली तत्वों को निकालने के लिए निम्न स्क्रिप्ट का उपयोग करता हूं

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

7

बस छोरों के लिए एक विकल्प का योगदान करना चाहते हैं ... कुंजी में अंतराल को संबोधित करते हुए ...

मेरे मामले में मैं अनुक्रमिक सरणी कुंजियाँ रखना चाहता था जब ऑपरेशन पूरा हो गया था (न केवल विषम संख्या, जो कि मैं घूर रहा था। बस विषम कुंजियों को देखने के लिए कोड सेट करना मेरे लिए नाजुक लग रहा था और भविष्य के अनुकूल नहीं था।)

मैं कुछ इस तरह की तलाश कर रहा था: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

Array_filter और array_slice का संयोजन चाल करता है।

$example = array_filter($example); $example = array_slice($example,0);

क्षमता या बेंचमार्क पर कोई विचार नहीं है लेकिन यह काम करता है।


मुझे लगता है कि array_values ​​के पास array_slice के समान परिणाम होगा। बाद में कोड पढ़ने और यह क्या कर रहा है यह समझने के संदर्भ में अधिक सहज लगता है।
अर्लोमेडिया

6
$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");   

foreach ($my as $key => $value) {
    if (is_null($value)) unset($my[$key]);
}

foreach ($my as $key => $value) {
    echo   $key . ':' . $value . '<br>';
} 

उत्पादन

1: 5

2: 6



5

बस एक पंक्ति: अपडेट (@suther के लिए धन्यवाद):

$array_without_empty_values = array_filter($array);

अपने दूसरे पैरामीटर की आवश्यकता नहीं है: $ clean_array = array_filter ($ गंदे_अरे);
सुथेर

4

array_filterखाली मान निकालने के लिए फ़ंक्शन का उपयोग करें :

$linksArray = array_filter($linksArray);
print_r($linksArray);

वह खाली तारों को हटाना चाहता है , जो खाली मूल्यों के बराबर नहीं है।
क्रैनियो

4

खाली सरणी तत्व निकालें

function removeEmptyElements(&$element)
{
    if (is_array($element)) {
        if ($key = key($element)) {
            $element[$key] = array_filter($element);
        }

        if (count($element) != count($element, COUNT_RECURSIVE)) {
            $element = array_filter(current($element), __FUNCTION__);
        }

        return $element;
    } else {
        return empty($element) ? false : $element;
    }
}

$data = array(
    'horarios' => array(),
    'grupos' => array(
        '1A' => array(
            'Juan' => array(
                'calificaciones' => array(
                    'Matematicas' => 8,
                    'Español' => 5,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => 10,
                    'marzo' => '',
                )
            ),
            'Damian' => array(
                'calificaciones' => array(
                    'Matematicas' => 10,
                    'Español' => '',
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => 20,
                    'febrero' => '',
                    'marzo' => 5,
                )
            ),
        ),
        '1B' => array(
            'Mariana' => array(
                'calificaciones' => array(
                    'Matematicas' => null,
                    'Español' => 7,
                    'Ingles' => 9,
                ),
                'asistencias' => array(
                    'enero' => null,
                    'febrero' => 5,
                    'marzo' => 5,
                )
            ),
        ),
    )
);

$data = array_filter($data, 'removeEmptyElements');
var_dump($data);

यह काम करता हैं!


3

अपनी विधि के अनुसार, आप उन तत्वों को दूसरे सरणी में पकड़ सकते हैं और उस तरह का उपयोग कर सकते हैं, जैसे कि

foreach($linksArray as $link){
   if(!empty($link)){
      $new_arr[] = $link
   }
}

print_r($new_arr);

1

यह कोशिश करो ** ** उदाहरण

$or = array(
        'PersonalInformation.first_name' => $this->request->data['User']['first_name'],
        'PersonalInformation.last_name' => $this->request->data['User']['last_name'],
        'PersonalInformation.primary_phone' => $this->request->data['User']['primary_phone'],
        'PersonalInformation.dob' => $this->request->data['User']['dob'],
        'User.email' => $this->request->data['User']['email'],
    );



 $or = array_filter($or);

    $condition = array(
        'User.role' => array('U', 'P'),
        'User.user_status' => array('active', 'lead', 'inactive'),
        'OR' => $or
    );

1
यह क्या है? अन्य बहुत ही प्रासंगिक उत्तरों के टन हैं। आप यहाँ क्या जोड़ रहे हैं?
फेलिक्स गगनोन-ग्रेनियर

url देखें कि यहां क्या प्रश्न था !! / * खाली सरणी तत्व को हटा दें * /
आशीष पाठक

1

मुझे लगता है कि array_walk यहां अधिक उपयुक्त है

$linksArray = array('name', '        ', '  342', '0', 0.0, null, '', false);

array_walk($linksArray, function(&$v, $k) use (&$linksArray){
    $v = trim($v);
    if ($v == '')
        unset($linksArray[$k]);
});
print_r($linksArray);

आउटपुट:

Array
(
    [0] => name
    [2] => 342
    [3] => 0
    [4] => 0
)
  • हमने सुनिश्चित किया कि यदि उपयोगकर्ता एक से अधिक स्थान जोड़ता है, तो भी रिक्त मान हटा दिए जाते हैं
  • हमने मान्य मानों से रिक्त स्थानों की छंटनी भी की

  • अंत में, केवल (अशक्त), (बूलियन झूठी) और ('') को खाली स्ट्रिंग माना जाएगा

जैसा कि Falseइसे हटाने के लिए ठीक है, क्योंकि AFAIK उपयोगकर्ता बूलियन मूल्यों को प्रस्तुत नहीं कर सकता है।


0

इस प्रकार की चीजों के साथ, यह स्पष्ट होना बेहतर है कि आप क्या चाहते हैं और क्या नहीं चाहते हैं।

यह अगले आदमी को array_filter()बिना कॉलबैक के व्यवहार पर आश्चर्यचकित नहीं होने में मदद करेगा । उदाहरण के लिए, मैं इस सवाल पर समाप्त हो गया क्योंकि मैं भूल गया था कि array_filter()हटाया गया NULLया नहीं। मैंने समय बर्बाद किया जब मैं बस नीचे दिए गए समाधान का उपयोग कर सकता था और मेरा जवाब था।

इसके अलावा, लॉजिक इस मायने में भाषा-विज्ञान है कि कोड को किसी अन्य भाषा में कॉपी किया जा सकता है, बिना php फ़ंक्शन के व्यवहार के बिना, array_filterजब कोई कॉलबैक पास नहीं होता है।

मेरे समाधान में, यह स्पष्ट है कि क्या हो रहा है। कुछ रखने के लिए एक सशर्त निकालें या अतिरिक्त मानों को फ़िल्टर करने के लिए एक नई शर्त जोड़ें।

वास्तविक उपयोग की उपेक्षा करें array_filter()क्योंकि मैं अभी इसे एक कस्टम कॉलबैक पास कर रहा हूं - आप आगे बढ़ सकते हैं और यदि आप चाहते हैं तो इसे अपने स्वयं के फ़ंक्शन में निकाल सकते हैं। मैं इसे केवल एक foreachलूप के लिए चीनी के रूप में उपयोग कर रहा हूं ।

<?php

$xs = [0, 1, 2, 3, "0", "", false, null];

$xs = array_filter($xs, function($x) {
    if ($x === null) { return false; }
    if ($x === false) { return false; }
    if ($x === "") { return false; }
    if ($x === "0") { return false; }
    return true;
});

$xs = array_values($xs); // reindex array   

echo "<pre>";
var_export($xs);

इस दृष्टिकोण का एक और लाभ यह है कि आप फ़िल्टरिंग को एक अमूर्त फ़ंक्शन में विभाजित कर सकते हैं जो एक सरणी प्रति एकल मान को फ़िल्टर करता है और एक कंपोजेबल समाधान तक बनाता है।

इस उदाहरण और आउटपुट के लिए इनलाइन टिप्पणियां देखें।

<?php

/**
 * @param string $valueToFilter
 *
 * @return \Closure A function that expects a 1d array and returns an array
 *                  filtered of values matching $valueToFilter.
 */
function filterValue($valueToFilter)
{
    return function($xs) use ($valueToFilter) {
        return array_filter($xs, function($x) use ($valueToFilter) {
            return $x !== $valueToFilter;
        });
    };
}

// partially applied functions that each expect a 1d array of values
$filterNull = filterValue(null);
$filterFalse = filterValue(false);
$filterZeroString = filterValue("0");
$filterEmptyString = filterValue("");

$xs = [0, 1, 2, 3, null, false, "0", ""];

$xs = $filterNull($xs);        //=> [0, 1, 2, 3, false, "0", ""]
$xs = $filterFalse($xs);       //=> [0, 1, 2, 3, "0", ""]
$xs = $filterZeroString($xs);  //=> [0, 1, 2, 3, ""]
$xs = $filterEmptyString($xs); //=> [0, 1, 2, 3]

echo "<pre>";
var_export($xs); //=> [0, 1, 2, 3]

अब आप गतिशील रूप से एक फ़ंक्शन बना सकते हैं जिसका filterer()उपयोग करके pipe()आप के लिए ये आंशिक रूप से लागू किए गए फ़ंक्शन लागू होंगे।

<?php

/**
 * Supply between 1..n functions each with an arity of 1 (that is, accepts
 * one and only one argument). Versions prior to php 5.6 do not have the
 * variadic operator `...` and as such require the use of `func_get_args()` to
 * obtain the comma-delimited list of expressions provided via the argument
 * list on function call.
 *
 * Example - Call the function `pipe()` like:
 *
 *   pipe ($addOne, $multiplyByTwo);
 *
 * @return closure
 */
function pipe()
{
    $functions = func_get_args(); // an array of callable functions [$addOne, $multiplyByTwo]
    return function ($initialAccumulator) use ($functions) { // return a function with an arity of 1
        return array_reduce( // chain the supplied `$arg` value through each function in the list of functions
            $functions, // an array of functions to reduce over the supplied `$arg` value
            function ($accumulator, $currFn) { // the reducer (a reducing function)
                return $currFn($accumulator);
            },
            $initialAccumulator
        );
    };
}

/**
 * @param string $valueToFilter
 *
 * @return \Closure A function that expects a 1d array and returns an array
 *                  filtered of values matching $valueToFilter.
 */
function filterValue($valueToFilter)
{
    return function($xs) use ($valueToFilter) {
        return array_filter($xs, function($x) use ($valueToFilter) {
            return $x !== $valueToFilter;
        });
    };
}

$filterer = pipe(
    filterValue(null),
    filterValue(false),
    filterValue("0"),
    filterValue("")
);

$xs = [0, 1, 2, 3, null, false, "0", ""];
$xs = $filterer($xs);

echo "<pre>";
var_export($xs); //=> [0, 1, 2, 3]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.