بعد array_filter()، كيف يمكنني إعادة ضبط المفاتيح للانتقال بترتيب رقمي بدءًا من 0

StackOverflow https://stackoverflow.com/questions/3401850

  •  25-09-2019
  •  | 
  •  

سؤال

لقد استخدمت للتو array_filter لإزالة الإدخالات التي لها القيمة '' فقط من مصفوفة، والآن أريد تطبيق تحويلات معينة عليها اعتمادًا على العنصر النائب الذي يبدأ من 0، ولكن لسوء الحظ لا يزال يحتفظ بالفهرس الأصلي.لقد بحثت لبعض الوقت ولم أتمكن من رؤية أي شيء، ربما فاتني ما هو واضح، لكن سؤالي هو...

كيف يمكنني بسهولة إعادة ضبط فهارس المصفوفة لتبدأ من 0 وترتيبها في المصفوفة الجديدة، بدلاً من الاحتفاظ بالفهارس القديمة؟

هل كانت مفيدة؟

المحلول

إذا اتصلت array_values في صفيفك ، سيتم إرجاعه من الصفر.

نصائح أخرى

إذا كنت تستخدم مرشح الصفيف ، فافعل ذلك على النحو التالي

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

يستخدم 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

أشعر بالقلق بشأن عدد المبرمجين الذين قاموا بنسخ/لصق ملف array_values(array_filter()) طريقة في رموزهم - أتساءل كم عدد المبرمجين الذين واجهوا مشاكل عن غير قصد بسبب جشع 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_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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top