খালি অ্যারে আইটেমগুলি এড়িয়ে যাওয়ার সময় আমি কীভাবে একটি অ্যারে চালিত করতে পারি?


96

পার্ল join()খালি অ্যারে মানগুলি উপেক্ষা করে (স্কিপস); পিএইচপি এর implode()উপস্থিত হয় না।

ধরুন আমার একটি অ্যারে আছে:

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

উৎপাদনের:

one---four--six

পরিবর্তে (পছন্দসই IMHO):

one-four-six

আমি যে আচরণটি সন্ধান করছি তার সাথে অন্য কোনও বিল্ট-ইন? বা এটি একটি কাস্টম জব্বি হতে চলেছে?


4
পার্লের আচরণ সম্পর্কে আপনি ভুল। 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,খালি স্ট্রিং করবে।
ইকেগামি

উত্তর:


212

আপনি ব্যবহার করতে পারেন array_filter():

যদি কোনও কলব্যাক সরবরাহ না করা হয় তবে সমান ইনপুটFALSE ( বুলিয়ান রূপান্তরিত দেখুন ) এর সমস্ত এন্ট্রি সরানো হবে।

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

স্পষ্টতই যদি আপনার অ্যারেতে 0(বা অন্য কোনও মান যা মূল্যায়ণ করে false) থাকে তবে এটি কাজ করবে না এবং আপনি এটি রাখতে চান। তবে তারপরে আপনি নিজের কলব্যাক ফাংশন সরবরাহ করতে পারেন।


5
তার মানে কি false, এবং 0তাও ফেলে দেওয়া হবে?
বেন

4
@ ম্যাম: হ্যাঁ, তবে আপনি সর্বদা নিজের কলব্যাক সরবরাহ করতে পারেন। empty, আপনি এটি ব্যবহার, এছাড়াও বিবেচনা করবে 0এবং falseযেমন false(এবং অপসারণ) BTW।
ফেলিক্স ক্লিং

4
+1 টি, কিন্তু এটা, উল্লেখ্য গত হয়েছে array_filter()যে বন্ধ ডিফল্ট ফিল্টার দ্বারা false, null, খালি স্ট্রিং ( '') এবং 0
টেডেক

4
@ টেডেক: হ্যাঁ, কেবল উদ্ধৃতিটির লিঙ্কটি অনুসরণ করুন। এমনকি আরও মানগুলি বিবেচনা করা হয় false: খালি অ্যারে 0.0এবং "0"
ফেলিক্স ক্লিং

@ ফেলিক্স: আমি এটি জানতাম - পিএইচপি-তে নতুন লোকের জন্য কেবল এটি চাপ দিতে চেয়েছিল;) যাইহোক: আপনাকে ধন্যবাদ
টাদেক

9

আমি মনে করি আপনি এটি অন্তর্নির্মিত বিবেচনা করতে পারবেন না (কারণ ফাংশনটি কোনও ব্যবহারকারী সংজ্ঞায়িত ফাংশন দিয়ে চলছে) তবে আপনি সর্বদা অ্যারে_ফিল্টার ব্যবহার করতে পারবেন
কিছুটা এইরকম:

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

4
emptyকোনও কলব্যাক পাস না করে ব্যবহার করার একই প্রভাব রয়েছে। সম্পাদনা করুন: আপনাকে ফেরতের মানটি অস্বীকার করতে হবে। অন্যথায় কেবল খালি উপাদানগুলিই ফিরে আসবে;) (আসলে emptyআপনি আগে যেমন ব্যবহার করেছিলেন এটিও ভুল ছিল)
ফেলিক্স ক্লিং

4
হ্যাঁ, এটা পিছিয়ে। তবে আপনি আমাকে সঠিক ধারণাটি দিয়েছেন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, ইত্যাদি ব্যবহার func। ' 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

আমি যা সন্ধান করতে পারি তার উপর ভিত্তি করে, আমি বলব সম্ভাবনা রয়েছে, এর জন্য নির্মিত কোনও পিএইচপি ব্যবহারের সত্যিই কোনও উপায় নেই। তবে আপনি সম্ভবত এর লাইন ধরে কিছু করতে পারেন:

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() এটি এখানে গ্রহণযোগ্য উপায় বলে মনে হচ্ছে এবং সম্ভবত এটি এখনও সবচেয়ে শক্ত উত্তর টিবিএইচ।

তবে, নীচেরগুলিও কাজ করবে যদি আপনি গ্যারান্টি দিতে পারেন যে প্রতিটি অ্যারের উপাদানটির স্ট্রিংগুলিতে "আঠালো" অক্ষর ইতিমধ্যে বিদ্যমান নেই (যা বেশিরভাগ ব্যবহারিক পরিস্থিতিতে একটি প্রদত্ত হবে - অন্যথায় আপনি পার্থক্য করতে সক্ষম হবেন না) অ্যারের আসল তথ্য থেকে আঠালো):

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

-3

এটা চেষ্টা কর:

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

সতর্কতা রোধ করতে আপনি আইসেট () ব্যবহার করতে পারেন।
ব্যবহারকারী 2775080

আমি নিশ্চিত না কীভাবে isset()বা arrayমূল পোস্টের উদ্বেগের কোনও কোনও হিসাবে ইনপুট অ্যারে কাস্টিং করছি ?
টম অ্যাগার

4
এটি কোনও সমাধান নয়। (অ্যারে) এ কাস্টিং অ্যারে থেকে খালি আইটেমগুলি সরিয়ে দেয় না।
এমজেউন্ডারলিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.