অ্যারে_ফিল্টার () এর পরে, 0 থেকে শুরু করে আমি কীভাবে সংখ্যাসমূহে যেতে চাবিগুলি পুনরায় সেট করতে পারি


108

আমি কেবল অ্যারে থেকে কেবল মূল্য '' ছিল এমন এন্ট্রিগুলি সরাতে অ্যারে_ ফিল্টার ব্যবহার করেছি এবং এখন 0 থেকে শুরু করে স্থানধারীর উপর নির্ভর করে আমি এটিতে নির্দিষ্ট রূপান্তরগুলি প্রয়োগ করতে চাই, তবে দুর্ভাগ্যক্রমে এটি এখনও মূল সূচকটি ধরে রেখেছে। আমি কিছুক্ষণ তাকিয়েছিলাম এবং কিছুই দেখতে পেলাম না, সম্ভবত আমি কেবল স্পষ্টভাবে মিস করেছি তবে আমার প্রশ্নটি হ'ল ...

পুরানো সূচকগুলি বজায় রাখার পরিবর্তে আমি কীভাবে সহজে অ্যারের সূচকগুলি 0 থেকে শুরু করতে এবং নতুন অ্যারে ক্রমে যেতে পারি?



আপনি যদি নিশ্চিত না হন যে আপনার অ্যারেতে কোনও শূন্য / শূন্য-ইশ / মিথ্যা মান নেই, তবে আপনাকে অবশ্যই ব্যবহার না করার জন্য অনুরোধ করতে হবে array_filter()- আপনি যা চান তার চেয়ে আরও বেশি পরিমাণে শুদ্ধ করতে পারেন। এখানে একটি ডেমো সঙ্গে কিছু ব্যাখ্যা stackoverflow.com/a/43657056/2943403
mickmackusa

উত্তর:


222

আপনি যদি array_valuesআপনার অ্যারেতে কল করেন তবে এটি শূন্য থেকে পুনর্নির্মাণ করা হবে।


লিঙ্কটি আর কাজ করে না, পরিবর্তে php.net/manual/en/function.array-values.php ব্যবহার করুন। আমি এটি আপডেট করতে পারি না, কারণ আমার কমপক্ষে 6 টি অক্ষর পরিবর্তন করতে হবে।
রাসমুস হ্যানসেন

37

আপনি যদি অ্যারে ফিল্টার ব্যবহার করছেন তবে নীচে এটি করুন

$NewArray = array_values(array_filter($OldArray));

3
ওহ, আমি যখন জসন_কেনডের একটি অ্যারের ফলাফলটি জসন_কেনডে একটি অ্যারে_ফিল্টার করা অ্যারের চেয়ে পৃথক কেন তা জানার চেষ্টা হারিয়ে ফেলেছি ... আপনাকে অনেক ধন্যবাদ ...
জেরথের

13

আমি কতজন প্রোগ্রামার নির্দোষভাবে এই array_values(array_filter())পদ্ধতিটি তাদের কোডগুলিতে অনুলিপি করে / কপি করেছেন তা নিয়ে আমি উদ্বিগ্ন - আমি আশ্চর্য হয়েছি যে অ্যারে_ফিলারের লোভের কারণে কতজন প্রোগ্রামার অজান্তেই সমস্যায় পড়েছিল। বা আরও খারাপ, কতজন লোক কখনই আবিষ্কার করতে পারেনি যে ফাংশনটি অ্যারে থেকে অনেকগুলি মান মুছে দেয় ...

আমি NULLএকটি অ্যারের থেকে উপাদানগুলি সরিয়ে ফেলা এবং কীগুলি পুনরায় সূচিকর্ম করার দ্বি-অংশ প্রক্রিয়াটির জন্য আরও ভাল বিকল্প উপস্থাপন করব ।

যাইহোক, প্রথমে, আমি অত্যন্ত লোভনীয় যে আমি লোভী প্রকৃতির উপর জোর দিয়েছি array_filter()এবং কীভাবে এটি নিঃশব্দে আপনার প্রকল্পটি বানর করে ফেলতে পারে। এখানে এতে মিশ্র মান সহ একটি অ্যারে রয়েছে যা সমস্যাটি প্রকাশ করবে:

$array=['foo',NULL,'bar',0,false,null,'0',''];

বড় হাতের অক্ষর / লোয়ারকেস নির্বিশেষে নাল মানগুলি সরানো হবে।

তবে যখন আমরা অ্যারে_ভ্যালু () এবং অ্যারে_ফিল্টার () ব্যবহার করি তবে অ্যারেতে কী থাকে তা দেখুন :

array_values(array_filter($array));

আউটপুট অ্যারে ($ অ্যারে):

array (
  0 => 'foo',
  1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!

এখন আপনি আমার পদ্ধতির সাথে কী পান তা দেখুন যা নতুন ফিল্টার করা অ্যারে তৈরি করতে অ্যারে_ওয়াক () এবং ইস_নুল () ব্যবহার করে:

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});

সহজে পাঠ / ব্যাখ্যা করার জন্য এটি একাধিক লাইনে লেখা যেতে পারে:

array_walk(                      // iterate each element of an input array
    $array,                      // this is the input array
    function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
        if(!is_null($v)){        // this literally checks for null values
            $filtered[]=$v;      // value is pushed into output with new indexes
        }
    }
);

আউটপুট অ্যারে ($ ফিল্টার):

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => false,
  4 => '0',
  5 => '',
)

আমার পদ্ধতির সাহায্যে আপনি আপনার পুনরায় সূচিযুক্ত কীগুলি, সমস্ত নন-নাল মান এবং কোনও নাল মান পাবেন না। আপনার অ্যারে নাল-ফিল্টারিং প্রয়োজনীয়তার জন্য একটি পরিষ্কার, পোর্টেবল, নির্ভরযোগ্য ওয়ান-লাইনার। এখানে একটি বিক্ষোভ আছে



একইভাবে, আপনি যদি খালি, মিথ্যা এবং নাল উপাদানগুলি (জিরো ধরে রেখে) মুছে ফেলতে চান তবে এই চারটি পদ্ধতি কাজ করবে:

var_export(array_values(array_diff($array,[''])));

অথবা

var_export(array_values(array_diff($array,[null])));

অথবা

var_export(array_values(array_diff($array,[false])));

অথবা

var_export(array_values(array_filter($array,'strlen')));

আউটপুট:

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => '0',
)

অবশেষে, যে কেউ ভাষা গঠনের বাক্য গঠন পছন্দ করেন, আপনি কেবল যোগ্যতার মানগুলিকে নতুন সূচকে ইস্যু করার জন্য একটি নতুন অ্যারেতে চাপ দিতে পারেন।

$array=['foo', NULL, 'bar', 0, false, null, '0', ''];

$result = [];
foreach ($array as $value) {
    if (strlen($value)) {
        $result[] = $value;
    }
}

var_export($result);

2
আপনি লিখলে array_values(array_filter($arr, function($el) {return $el !== '';}))কি জিনিসগুলি প্রত্যাশিতভাবে আচরণ করবে না ? ওপি যা জিজ্ঞাসা করছে তা করার প্রাকৃতিক উপায়ে মনে হচ্ছে এটি।
কেসি

1
হ্যাঁ. আমার বক্তব্যটি হ'ল ডেভেলপারদের array_filter()ডেটা সম্পর্কে অন্তরঙ্গ জ্ঞান পার্শ্ব প্রতিক্রিয়া ছাড়াই লোভী ফিল্টারিংয়ের অনুমতি না দিলে এর ডিফল্ট আচরণ ব্যবহার করার তাগিদ এড়ানো উচিত । (আরও সতর্কতা: empty()এই একই ফ্যাশন আচরণ করে এবং এর লোভ মধ্যে একটি খালি অ্যারে অন্তর্ভুক্ত।)
মিকম্যাকুসা

2
এই উত্তরটি সম্পূর্ণ ভিন্ন প্রশ্নের উত্তর দেয়, কোনওভাবেই, আকার বা ফর্মের সাথে মূল প্রশ্নের সাথে সম্পর্কিত নয়।
AnrDaemon

1
array_filter()ম্যানুয়ালটিতে যা বলা হয়েছে তার উপর ভিত্তি করে আপনি যেমনটি আশা করেছিলেন ঠিক তেমন আচরণ করে : php.net/manual/en/function.array-filter.php "যদি কোনও কলব্যাক সরবরাহ না করা হয় তবে FALSE এর সমান অ্যারের সমস্ত এন্ট্রি (বুলিয়ান রূপান্তরিত দেখুন) ) সরিয়ে ফেলা হবে." এবং পিএইচপি প্রোগ্রামারদের মধ্যে এটি সাধারণ জ্ঞান হওয়া উচিত যে বুলিয়ানকে জোর করে যখন 0, নাল, মিথ্যা, '' এবং '0' সমস্ত মিথ্যাতে মূল্যায়ন করে।
ম্যাডসেন

1
কথাটি হচ্ছে, বেশিরভাগ লোকেরা কী আশা করবেন তা জানেন না। আপনি করেন, আমি করি, তবে অনেকেই করেন না। যারা জানে না তাদের সহায়তা করার জন্য আমি এই উত্তরটি পোস্ট করেছি।
মিকম্যাকুসা

12

ব্যবহার array_values():

<?php

$array = array('foo', 'bar', 'baz');
$array = array_filter($array, function ($var) {
    return $var !== 'bar';
});

print_r($array); // indexes 0 and 2
print_r(array_values($array)); // indexes 0 and 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.