खाली सरणी वस्तुओं को छोड़ते समय मैं किसी सरणी को कैसे निहित कर सकता हूं?


94

पर्ल की join()उपेक्षा (खाली) खाली सरणी मान; PHP के implode()लिए प्रकट नहीं होता है।

मान लीजिए कि मेरे पास एक सरणी है:

$array = array('one', '', '', 'four', '', 'six');
implode('-', $array);

पैदावार:

one---four--six

के बजाय (IMHO बेहतर):

one-four-six

मैं जिस व्यवहार की तलाश कर रहा हूं, उसके साथ कोई अन्य अंतर्निहित इन्स? या यह एक कस्टम जॉबी बनने जा रहा है?


2
आप पर्ल के व्यवहार के बारे में गलत हैं। joinअपरिभाषित तत्वों को न छोड़ें। वास्तव में, वे एक चेतावनी में परिणाम करते हैं। $a[0]="a"; $a[2]="c"; say join "-",@a;प्रदर्शित करता है Use of uninitialized value within @a in join or stringऔर a--c। एक join '-', grep !defined, ...अपरिभाषित मूल्यों को छोड़ने के लिए उपयोग कर सकते हैं । grep !length,खाली तार करेंगे।
इकेगामी

जवाबों:


210

आप उपयोग कर सकते हैं array_filter():

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

implode('-', array_filter($array));

यदि आपके पास 0(या किसी अन्य मूल्य का मूल्यांकन करता है false) आपके एरे में है तो स्पष्ट रूप से यह काम नहीं करेगा और आप इसे रखना चाहते हैं। लेकिन फिर आप अपना खुद का कॉलबैक फ़ंक्शन प्रदान कर सकते हैं।


5
इसका मतलब यह होगा कि false, और 0भी बाहर फेंक दिया जाता है?
बेन

1
@ माज़: हाँ, लेकिन आप हमेशा अपना कॉलबैक प्रदान कर सकते हैं। empty, आप इसे उपयोग के रूप में, यह भी व्यवहार करेगा 0और falseके रूप में false(और यह निकालने के लिए) btw।
फेलिक्स क्लिंग

3
+1, लेकिन यह उल्लेख किया जा सकता है कि है array_filter()कि हर बंद डिफ़ॉल्ट फ़िल्टर द्वारा false, null, रिक्त स्ट्रिंग ( '') और 0
ताडेक

1
@ टैडेक: हाँ, बस उद्धरण में लिंक का पालन करें। इससे भी अधिक मान के रूप में माना जाता है false: खाली सरणी, 0.0और "0"
फेलिक्स क्लिंग

@ फेलिक्स: मुझे यह पता था - बस इसे PHP में नए लोगों के लिए तनाव देना चाहता था;) वैसे भी: धन्यवाद
Tadeck

9

मुझे लगता है कि आप इस पर विचार नहीं कर सकते (क्योंकि फ़ंक्शन उपयोगकर्ता परिभाषित फ़ंक्शन के साथ चल रहा है), लेकिन आप हमेशा array_filter का उपयोग कर सकते हैं ।
कुछ इस तरह:

function rempty ($var)
{
    return !($var == "" || $var == null);
}
$string = implode('-',array_filter($array, 'rempty'));

1
उपयोग करने emptyका समान प्रभाव होता है जैसे बिना कॉलबैक पास किए। संपादित करें: आपको वापसी मूल्य को नकारना होगा। अन्यथा केवल खाली तत्वों को वापस कर दिया जाएगा;) (वास्तव में emptyजैसा आपने पहले किया था वह भी गलत था)
फेलिक्स क्लिंग

1
हाँ, यह पिछड़ा हुआ है। लेकिन आपने मुझे सही विचार दियाimplode('-', array_filter($ary, create_function('$a', 'return $a!="";')));
टॉम ऑस्टर

3

आपको फ़िल्टर कैसे लागू करना चाहिए यह केवल इस बात पर निर्भर करता है कि आप "खाली" के रूप में क्या देखते हैं।

function my_filter($item)
{
    return !empty($item); // Will discard 0, 0.0, '0', '', NULL, array() of FALSE
    // Or...
    return !is_null($item); // Will only discard NULL
    // or...
    return $item != "" && $item !== NULL; // Discards empty strings and NULL
    // or... whatever test you feel like doing
}

function my_join($array)
{
    return implode('-',array_filter($array,"my_filter"));
} 

3

निकालने के लिए null, स्ट्रिंग false, emptyलेकिन संरक्षित 0, आदि दुर्गंध का उपयोग करें। ' strlen'

$arr = [null, false, "", 0, "0", "1", "2", "false"];
print_r(array_filter($arr, 'strlen'));

उत्पादन होगा:

//Array ( [3] => 0 [4] => 0 [5] => 1 [6] => 2 [7] => false )

1

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

function implode_skip_empty($glue,$arr) {
      $ret = "";
      $len = sizeof($arr);
      for($i=0;$i<$len;$i++) {
          $val = $arr[$i];    
          if($val == "") {
              continue;
          } else {
            $ret .= $arr.($i+1==$len)?"":$glue;
          }
      }
      return $ret;
}

1

इसे इस्तेमाल करे:

$result = array();

foreach($array as $row) { 
   if ($row != '') {
   array_push($result, $row); 
   }
}

implode('-', $result);


-1

array_fileter() लगता है यहाँ स्वीकृत तरीका है, और शायद अभी भी सबसे मजबूत जवाब tbh है।

हालांकि, निम्नलिखित भी काम करेंगे यदि आप गारंटी दे सकते हैं कि "गोंद" वर्ण प्रत्येक सरणी तत्व के तारों में पहले से मौजूद नहीं है (जो कि सबसे व्यावहारिक परिस्थितियों में दिया जाएगा - अन्यथा आप अंतर नहीं कर पाएंगे सरणी में वास्तविक डेटा से गोंद):

$array = array('one', '', '', 'four', '', 'six');
$str   = implode('-', $array);
$str   = preg_replace ('/(-)+/', '\1', $str);

-3

इसे इस्तेमाल करे:

if(isset($array))  $array = implode(",", (array)$array);

आप चेतावनियों को रोकने के लिए isset () का उपयोग करना चाह सकते हैं।
user2775080

मुझे यकीन नहीं है कि isset()इनपुट ऐरे को कैसे या किस तरह से कास्टिंग किया जाएarray मूल पोस्ट की किसी भी चिंता संबोधित ?
टॉम ऑगर

1
यह कोई हल नहीं है। (सरणी) पर कास्टिंग सरणी से खाली आइटम नहीं निकालता है।
मझवुंदरलिच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.