2012-03-27 19 views
15

से रिक्त तत्वों और उपनगरों को रिकर्सली से हटाएं, मुझे PHP में सरणी से खाली तत्वों को निकालने की पुरानी समस्या के लिए एक सरल, सीधा-आगे समाधान नहीं मिल रहा है।एक बहु-आयामी सरणी

मेरे इनपुट सरणी कुछ ऐसा दिखाई देगा:

Array ([0] => Array ([Name] => [EmailAddress] =>)) 

(और इसी तरह, वहाँ और अधिक डेटा है कि अगर, हालांकि वहाँ नहीं हो सकता है ...)

यह ऊपर की तरह लग रहा है, मैं इसे संसाधित करने के बाद पूरी तरह खाली होना चाहिए।

तो print_r($array); उत्पादन होगा:

Array () 

अगर मैं $arrayX = array_filter($arrayX); चलाने मैं अभी भी हीprint_r उत्पादन मिलता है। जहां भी मैंने देखा है, यह सुझाव देता है कि PHP5 में रिक्त सरणी तत्वों को हटाने का यह सबसे आसान तरीका है।

मैं भी $arrayX = array_filter($arrayX,'empty_array'); कोशिश की, लेकिन मैं निम्नलिखित त्रुटि मिली:

Warning: array_filter() [function.array-filter]: The second argument, 'empty_array', should be a valid callback

क्या मैं गलत कर रहा हूँ?

+0

array_filter 1 डी सरणी के लिए सेट है। –

+0

क्या आप अनुमानित आउटपुट के साथ नमूना इनपुट दे सकते हैं? आपके प्रश्न की व्याख्या करने के कुछ अलग तरीके हैं, * "अगर यह उपर्युक्त जैसा दिखता है, तो मैं इसे संसाधित करने के बाद इसे पूरी तरह से खाली करना चाहता हूं।" * मुझे फेंक रहा है, क्या आप इसे पूरी तरह से चला जाना चाहते हैं या एक खाली सरणी बनने के लिए? –

+0

यह एक बहु-आयामी सरणी है। array_filter केवल एक आयाम में काम करता है। आपको अपनी सरणी के माध्यम से फिर से शुरू करने की आवश्यकता है और पहले प्रत्येक पुनरावृत्ति के लिए array_filter लागू करें। – Nilpo

उत्तर

21

$array में हर सरणी पर फ़िल्टर लागू करने array_map() उपयोग करके देखें:

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

डेमो: http://codepad.org/xfXEeApj

+1

में ट्रिपल-नेस्टेड संरचना का पालन करने और साफ़ करने में विफल रहा, प्रतीक्षा प्रतीक्षा करें, क्या आप केवल पूरे सरणी को हटाना चाहते हैं यदि * सभी * आइटम खाली हैं ? ऐसा नहीं है कि यह क्या करता है। क्या आप अनुमानित आउटपुट के साथ नमूना इनपुट दे सकते हैं? –

+1

नहीं। यह काम नहीं करता है: -/ –

+0

आपके प्रश्न और टिप्पणियों में स्पष्टीकरण के अनुसार, हाँ यह होना चाहिए: http://codepad.org/FdfY5aqj जब सभी खाली आइटम हटा दिए जाते हैं, तो आप एक खाली सरणी के साथ समाप्त होते हैं। यदि यह वही नहीं है जो आप चाहते हैं, तो कृपया अपेक्षित आउटपुट के साथ कुछ नमूना इनपुट दें। क्या आप अन्य सरणी से खाली करने के दुष्प्रभाव से चिंतित हैं? –

7

ऐसा करने के कई उदाहरण हैं। आप docs को आजमा सकते हैं (पहली टिप्पणी देखें)।

function array_filter_recursive($array, $callback = null) { 
    foreach ($array as $key => & $value) { 
     if (is_array($value)) { 
      $value = array_filter_recursive($value, $callback); 
     } 
     else { 
      if (! is_null($callback)) { 
       if (! $callback($value)) { 
        unset($array[$key]); 
       } 
      } 
      else { 
       if (! (bool) $value) { 
        unset($array[$key]); 
       } 
      } 
     } 
    } 
    unset($value); 

    return $array; 
} 

माना जाता है कि यह उदाहरण वास्तव में array_filter का उपयोग नहीं करता है लेकिन आपको बिंदु मिलता है।

+0

यह कोड 0 लंबाई की गहरी सरणी को अनसेट करने में सक्षम नहीं था, और – CodedMonkey

3

jeremyharris 'सुझाव अप के बाद, यह है कि मैं कैसे यह काम करने के लिए इसे बदलने के लिए की जरूरत:

function array_filter_recursive($array) { 
    foreach ($array as $key => &$value) { 
     if (empty($value)) { 
     unset($array[$key]); 
     } 
     else { 
     if (is_array($value)) { 
      $value = array_filter_recursive($value); 
      if (empty($value)) { 
       unset($array[$key]); 
      } 
     } 
     } 
    } 

    return $array; 
} 
4

स्वीकार्य उत्तर ओपी से पूछा गया बिल्कुल ठीक नहीं करता है। आप रिकर्सिवली सभी मूल्यों को झूठा सहित खाली सरणियों का मूल्यांकन निकालना चाहते हैं तो उसके बाद निम्न फ़ंक्शन का उपयोग करें:

function array_trim($input) { 
    return is_array($input) ? array_filter($input, 
     function (& $value) { return $value = array_trim($value); } 
    ) : $input; 
} 

या आप अपनी आवश्यकताओं के अनुसार वापसी शर्त को बदल सकता है, उदाहरण के लिए:

{ return !is_array($value) or $value = array_trim($value); } 

यदि आप केवल खाली सरणी को हटाना चाहते हैं। या आप स्थिति को केवल "" या झूठी या शून्य, आदि के लिए परीक्षण में बदल सकते हैं ...

साथ
2

प्रयास करें:

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

उदाहरण:

$array[0] = array(
    'Name'=>'', 
    'EmailAddress'=>'', 
); 
print_r($array); 

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

print_r($array); 

आउटपुट:

Array 
(
    [0] => Array 
     (
      [Name] => 
      [EmailAddress] => 
     ) 
) 

Array 
(
) 
0

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

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

स्टेटिक 2-मंद सरणी: इस कोड को 2 स्तर तत्वों पर एक "शून्य सुरक्षित" फिल्टर करता है और फिर खाली subarrays निकालता है: (See this demo to see this method work with different (trickier) array data)

$array=[ 
    ['Name'=>'','EmailAddress'=>''] 
]; 

var_export(
    array_filter( // remove the 2nd level in the event that all subarray elements are removed 
     array_map( // access/iterate 2nd level values 
      function($v){ 
       return array_filter($v,'strlen'); // filter out subarray elements with zero-length values 
      },$array // the input array 
     ) 
    ) 
); 

यहाँ के रूप में एक ही कोड है एक एक लाइनर:

var_export(array_filter(array_map(function($v){return array_filter($v,'strlen');},$array))); 

आउटपुट (मूल ओपी द्वारा निर्दिष्ट के रूप में):

array (
) 

* यदि आप खाली उपरागरों को हटाना नहीं चाहते हैं, तो बस बाहरी array_filter() कॉल को हटा दें। अज्ञात गहराई के बहु-आयामी सरणी के लिए


रिकर्सिव विधि: एक सरणी में स्तरों की संख्या अज्ञात कर रहे हैं, प्रत्यावर्तन एक तार्किक तकनीक है। निम्न कोड प्रत्येक उप-प्रक्रिया को संसाधित करेगा, शून्य-लंबाई मानों और किसी भी खाली उपरोक्त को हटाएगा। Here is a demo of this code with a few sample inputs.

$array=[ 
    ['Name'=>'','Array'=>['Keep'=>'Keep','Drop'=>['Drop2'=>'']],'EmailAddress'=>'','Pets'=>0,'Children'=>null], 
    ['Name'=>'','EmailAddress'=>'','FavoriteNumber'=>'0'] 
]; 

function removeEmptyValuesAndSubarrays($array){ 
    foreach($array as $k=>&$v){ 
     if(is_array($v)){ 
      $v=removeEmptyValuesAndSubarrays($v); // filter subarray and update array 
      if(!sizeof($v)){ // check array count 
       unset($array[$k]); 
      } 
     }elseif(!strlen($v)){ // this will handle (int) type values correctly 
      unset($array[$k]); 
     } 
    } 
    return $array; 
} 

var_export(removeEmptyValuesAndSubarrays($array)); 

आउटपुट:

array (
    0 => 
    array (
    'Array' => 
    array (
     'Keep' => 'Keep', 
    ), 
    'Pets' => 0, 
), 
    1 => 
    array (
    'FavoriteNumber' => '0', 
), 
) 

किसी को भी एक इनपुट सरणी है कि मेरे पुनरावर्ती विधि टूट जाता है पता चलता है, तो एक टिप्पणी के रूप में पोस्ट (अपने सरलतम रूप में) कृपया और मैं अपने जवाब अपडेट करेंगे।

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