โมดูลัสภายในวง

ฉันมีอาร์เรย์ที่ฉันวนซ้ำและแบ่งออกเป็นชิ้น ๆ 50 อย่างไรก็ตามในบางครั้งจำนวนรายการในอาร์เรย์นั้นมากกว่าจำนวนที่พอดีภายในชิ้นนั้น 50 เช่น:

$array = array(); // has 220 rows

for ($i = 0; $i < count($array); $i++) { 
    $j[] = $i;

    if ($i % 50 == 1) {
        print_r($j); // do something here with the 50 rows
        $j = null;
    }
}

ปัญหาคือสิ่งนี้จะไม่พิมพ์อะไรเลยหลังจาก 201 ฉันรู้ว่ามีคณิตศาสตร์พีชคณิตที่เกี่ยวข้องในการแก้ปัญหานี้ แต่ฉันกำลังหาช่องว่างอยู่ ช่วงเวลาแบบนี้ฉันอยากจะตั้งใจเรียนวิชาคณิตศาสตร์ตั้งแต่สมัยมัธยมจริงๆ


person Meisam Mulla    schedule 02.07.2013    source แหล่งที่มา
comment
ความปรารถนาของคุณคืออะไรหรือผลลัพธ์อาร์เรย์?   -  person Rikesh    schedule 02.07.2013
comment
ฉันคิดว่าเป็นเพราะมันหยุดเมื่อนับเป็น 50 ดังนั้นหลังจาก 200 มันไม่สามารถเข้าถึง 50 แถวได้อีก จึงหยุดที่ 201   -  person Matheno    schedule 02.07.2013
comment
อย่านับจำนวน ภายใน for() คุณเรียกใช้ฟังก์ชัน n ครั้งแทนที่จะเป็นครั้งเดียว   -  person    schedule 02.07.2013
comment
โดยพื้นฐานแล้วฉันต้องการส่งคำขอเป็นชุดไปยัง Facebook Graph API และใช้เวลาสูงสุดครั้งละ 50 รายการเท่านั้น   -  person Meisam Mulla    schedule 02.07.2013


คำตอบ (5)


ฉันคิดว่า array_chunk ตรงกับความต้องการของคุณและไม่จำเป็นต้องใช้คณิตศาสตร์

$result_array = array_chunk($array, 50, true);
person Rikesh    schedule 02.07.2013

เพิ่มเงื่อนไขเพิ่มเติม

if ($i % 50 == 1 || count($array)-1 == $i)
person sectus    schedule 02.07.2013
comment
มันจะทำงานอย่างไร? ตามตรรกะของฉัน count($j) จะถึงสูงสุดเพียง 50 เท่านั้น - person Meisam Mulla; 02.07.2013
comment
คุณกำลังแกล้งฉันเล่นนะ ไม่คิดเรื่องนี้ได้ยังไง! - person Meisam Mulla; 02.07.2013
comment
แต่คุณควรใช้คำตอบ @Rikesh - person sectus; 02.07.2013
comment
@MeisamMulla ดีใจสำหรับคุณที่คุณตัดสินใจใช้แนวทางปฏิบัติที่ดีที่สุด - person sectus; 04.07.2013

คุณเพียงแค่ต้องประกาศอาร์เรย์ใหม่ตามที่ฉันเดา:

$array = array(); // has 220 rows

for ($i = 0; $i < count($array); $i++) { 
    $j[] = $i;

    if ($i % 50 == 1) {
        print_r($j); // do something here with the 50 rows
        $j = array() ;
    }
}

เมื่อคุณดำเนินการ $j = null คุณจะไม่มีทางทำได้ $j[] = $i

person vikingmaster    schedule 02.07.2013
comment
นี่ไม่ใช่ประเด็น ฉันได้รับอาร์เรย์อื่นตามที่คาดไว้เมื่อใช้ $j = null - person Meisam Mulla; 02.07.2013

$array = array(); // has 220 rows

for ($i = 0; $i < count($array); $i++) {
    $j[] = $i;

    if ($i % 50 == 1) {
        doSomething($j); // do something here with the 50 rows
        $j = array(); // reset the array
    }
}
doSomething($j); // with the last 20 entries

หลังจากการวนซ้ำของคุณเสร็จสิ้น คุณจะมีรายการ 201 ถึง 220 รายการที่เหลือใน $j ดังนั้นคุณก็แค่ทำสิ่งต่างๆ อีกครั้ง

person Vlad Preda    schedule 02.07.2013

array_chunk อาจมีประโยชน์ โดยทั่วไปจะแบ่งอาเรย์ออกเป็นส่วนๆ เพื่อส่งคืนอาเรย์หลายมิติ

person David Jones    schedule 02.07.2013