2011-10-08 17 views
8

मुझे बहुस्तरीय सरणी पर खाली प्रविष्टियों को हटाने की आवश्यकता है। अभी के लिए मैं इस कोड खाली उप सरणियों के साथ प्रविष्टियों को हटा सकते हैं, लेकिन नहीं खाली सरणियों ... उलझन में है, इसलिए मैं ... मुझे लगता है कि कोड बेहतर व्याख्या करने के लिए मदद मिलेगी है ...PHP - एक सरणी की खाली प्रविष्टियों को दोबारा कैसे निकालें?

<?php 

/** 
* 
* This function remove empty entries on arrays 
* @param array $array 
*/ 
function removeEmptysFromArray($array) { 

    $filtered = array_filter($array, 'removeEmptyItems'); 
    return $filtered; 
} 

/** 
* 
* This is a Callback function to use in array_filter() 
* @param array $item 
*/ 
function removeEmptyItems($item) { 

    if (is_array($item)) { 
     return array_filter($item, 'removeEmptyItems'); 
    } 

    if (!empty($item)) { 
     return true; 
    } 
} 


$raw = array(
    'firstname' => 'Foo', 
    'lastname' => 'Bar', 
    'nickname' => '', 
    'birthdate' => array( 
     'day' => '', 
     'month' => '', 
     'year' => '', 
    ), 
    'likes' => array(
     'cars' => array('Subaru Impreza WRX STi', 'Mitsubishi Evo', 'Nissan GTR'), 
     'bikes' => array(), 
    ), 
); 

print_r(removeEmptysFromArray($raw)); 

?> 

ठीक है, "उपनाम", "जन्मदिन" को हटा देगा लेकिन "बाइक" को हटा नहीं रहा है जिसमें खाली सरणी है।

मेरा प्रश्न है ... "बाइक" प्रविष्टि को कैसे हटाएं?

शुभकामनाओं सहित,

मेरी अंग्रेजी के लिए क्षमा करें ...

+0

आप उन्हें क्यों निकालना चाहते हैं? – John

उत्तर

24

इस कोड का प्रयास करें: आप रिकर्सिवली काम करने के लिए array_filter चाहते हैं

<?php 
function array_remove_empty($haystack) 
{ 
    foreach ($haystack as $key => $value) { 
     if (is_array($value)) { 
      $haystack[$key] = array_remove_empty($haystack[$key]); 
     } 

     if (empty($haystack[$key])) { 
      unset($haystack[$key]); 
     } 
    } 

    return $haystack; 
} 

$raw = array(
    'firstname' => 'Foo', 
    'lastname' => 'Bar', 
    'nickname' => '', 
    'birthdate' => array(
     'day' => '', 
     'month' => '', 
     'year' => '', 
    ), 
    'likes' => array(
     'cars' => array('Subaru Impreza WRX STi', 'Mitsubishi Evo', 'Nissan GTR'), 
     'bikes' => array(), 
    ), 
); 

print_r(array_remove_empty($raw)); 
+0

बढ़िया, यह काम कर रहा है! सहायता के लिए धन्यवाद। –

+2

धन्यवाद, बस इसका इस्तेमाल किया। एक जोड़ा: यदि आप सरणी मानों में "सफेद जगह" तारों को भी हटाना चाहते हैं, तो एक छोटा "elseif" खंड जोड़ें: यदि (is_array ($ value)) { $ हैस्टैक [$ कुंजी] = array_remove_empty ($ haystack [$ कुंजी]); } elseif (is_string ($ हैस्टैक [$ कुंजी])) { $ हैस्टैक [$ कुंजी] = ट्रिम ($ मान); } उस तरह सरणी (सरणी ("", '')) खाली के रूप में भी वापस कर दी जाएगी। –

+0

अपने फ़ंक्शन को पोर्टेबल बनाने के लिए हमेशा रिकर्सिव कॉल में \ _ \ _ FUNCTION__ का उपयोग करें। –

-2

, आपको यह सुनिश्चित करने की आवश्यकता होगी कि बाद की कॉल सरणी के गहरे घोंसले वाले आइटमों को संपादित कर सकती है। संक्षिप्त: आपको संदर्भ द्वारा इसे पास करने की आवश्यकता होगी:

function removeEmptyItems(&$item) { 
    if (is_array($item) && $item) { 
     $item = array_filter(&$item, 'removeEmptyItems'); 
    } 

    return !!$item; 
} 
1

मुझे लगता है कि यह आपकी समस्या का समाधान करना चाहिए।

/** 
* Remove elements from array by exact values list recursively 
* 
* @param array $haystack 
* @param array $values 
* 
* @return array 
*/ 
function array_remove_by_values(array $haystack, array $values) 
{ 
    foreach ($haystack as $key => $value) { 
     if (is_array($value)) { 
      $haystack[$key] = array_remove_by_values($haystack[$key], $values); 
     } 

     if (in_array($haystack[$key], $values, true)) { 
      unset($haystack[$key]); 
     } 
    } 

    return $haystack; 
} 

आप इस तरह इसका इस्तेमाल कर सकते हैं::

$retArray =array_filter($array, arrayFilter); 

function arrayFilter($array) { 
    if(!empty($array)) { 
     return array_filter($array); 
    } 
} 
0

यहाँ मेरी समाधान है, यह रिकर्सिवली खाली मूल्यों की वास्तव में निर्दिष्ट सूची निकाल देंगे

$clean = array_remove_by_values($raw, ['', null, []]); 

ध्यान दें, यह खाली उप निकाल देता है यदि आप मानों में से एक के रूप में [] पास करते हैं तो सरणी।

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