استبدال مجموعة في حلقة foreach مع مجموعة معدلة في نفس الحلقة

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

  •  04-07-2019
  •  | 
  •  

سؤال

foreach($arrayOne as $value){
    do function
}

في المثال أعلاه، أود أن تمرير $ arrayOne في حلقة، لها وظيفة تعمل على أن يزيل بعض عناصر $ arrayOne وبعد ذلك تمر حلقة إزاء انخفاض $ arrayOne على العناصر التي تم تركها حتى حلقة يعود كاذبة.

والتوصيات؟

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

المحلول

إذا كنت ترغب في إجراء تعديلات على قيمة البنود مجموعة، واستخدام بالرجوع. إذا كنت ترغب في إزالة تماما عناصر مجموعة، تقسيم من أزواج مفتاح / قيمة.

$arrayOne = array('example', 'listing of', 'stuff');

foreach ($arrayOne as $key => &$value) {
    $value .= ' alteration';

    if ($value == 'listing of alteration') {
        unset($arrayOne[ $key ]);
    }

}

ورمز أعلاه سوف تضيف النص "تغيير" في نهاية كل عنصر في مجموعة. فإنه سيتم أيضا إزالة الفهرس الثاني عندما مباريات "قائمة التغيير". اختبارها على PHP 5.2

نصائح أخرى

هل في حاجة الى وظيفة لإزالة بعض عناصر المصفوفة؟

وإذا كان الأمر كذلك، يمكنك استخدام array_filter .

وأنصح وجود اثنين من صفائف،
واحد مع البيانات - dataarray،
الآخر فارغة في البداية - emptyarray
وأيا كان مؤهلا في foreachloop أولا، ش دفع إلى مجموعة 2nd، و في نهاية ذلك، إفراغ مجموعة الأولى، تبديل معرفات من صفائف اثنين (dataarray يصبح emptyarray وبالعكس) وتكرار حتى تعود كاذبة أو أيا كان

والأرنب لديه الجواب الصحيح لاستخدام كل ما يشير إلى تعديل القيم ومؤشر لإلغاء تعيين في حلقة foreach (I سيصوتون لكم ولكن هذه هي أول وظيفة لذلك أنا لم يكن لديك 15 مندوب من ذلك، آسف)

ومما لا شك فيه أن نتذكر أن استخدام الإشارة إذا كنت تمر من خلال لوظيفة التي تحتاج إلى تعديل قيمة كذلك. قد تحتاج أيضا لتمرير مجموعة كمرجع اذا كان لإزالة قيمة منه.

وأود أن أوصى جعل منطقية وظيفة العائد على ما إذا كان لإزالة لمنع خلق المزيد من المراجع. منها مثلا.

foreach ($array AS $key => &$value) {
    //& reference only needed if execFunction must edit $value
    if (execFunction(&$value)) { 
        unset($array[$key]);
    } else {
        $value['exec_failed']+=1;
    }
}
unset($value);

وأيضا فإن إشارة قيمة $ تستمر الماضي في نطاق حلقة، وبالتالي فإن وراء إلغاء تعيين.

ويعتقد الماضي، بدا كما لو كنت تريد أن يتكرر خلال مجموعة عدة مرات. ومن المؤكد أن تولي الاهتمام لكيفية توقف حلقة الخاص بك المنفذة.

وشكرا للجميع لمساعدتهم. وظيفة ضبطه () هي، في النهاية، ما هو مفيد لي في حاجة معينة اليوم. وإليك القصة القصيرة من استخدامي لإلغاء تعيين ():

//array to be processed
$one=array('1','2','3');
//array of terms previously defined as a group to compare against
$against=array('1','2');

foreach($one as $key=>$value){

    //pull out matching terms   
    $match=array_intersect($one,$against);
    //my need is to sum grouped numbers
    $sum=array_sum($match);
    echo $sum."<br />";

    //remove matching terms from original array
    foreach($match as $key=>$value){
        unset($one[$key]);
    }
}
//now a parent looping function will process the remaining array elements. In this case, the only one left is '3'.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top