ค้นหาองค์ประกอบสุดท้ายของอาร์เรย์ในขณะที่ใช้ foreach loop ใน PHP


215

ฉันกำลังเขียนผู้สร้างแบบสอบถาม SQL โดยใช้พารามิเตอร์บางตัว ใน Java มันง่ายมากที่จะตรวจสอบองค์ประกอบสุดท้ายของอาเรย์จากภายในสำหรับลูปโดยเพียงแค่ตรวจสอบตำแหน่งอาเรย์ปัจจุบันด้วยความยาวของอาเรย์

for(int i=0; i< arr.length;i++){
     boolean isLastElem = i== (arr.length -1) ? true : false;        
}

ใน PHP มีดัชนีที่ไม่ใช่จำนวนเต็มเพื่อเข้าถึงอาร์เรย์ ดังนั้นคุณต้องวนซ้ำแถวลำดับโดยใช้ลูป foreach สิ่งนี้จะเป็นปัญหาเมื่อคุณจำเป็นต้องทำการตัดสินใจ (ในกรณีของฉันเพื่อต่อท้ายหรือ / และพารามิเตอร์ขณะสร้างคิวรี)

ฉันแน่ใจว่าต้องมีวิธีมาตรฐานในการทำเช่นนี้

คุณจะแก้ปัญหานี้ใน PHP ได้อย่างไร


2
คุณกำลังพยายามที่จะตรวจสอบว่าคุณควรเชื่อมต่อ "และ" หรือ "หรือ" ระหว่างส่วนของประโยคที่ไหน?
Darryl Hein

1
เพียงแค่ชี้ให้เห็นว่าคุณควรเก็บผลรวมไว้ในตัวแปรแทนที่จะเรียกวิธีการสำหรับการวนซ้ำทุกครั้ง สำหรับ (int i = 0, int t = arr.length; i <t; i ++)
OIS


ลองดูวิธีแก้ปัญหานี้: stackoverflow.com/a/29474468/1478566
vbarbarosh

คำตอบ:


313

ดูเหมือนว่าคุณต้องการสิ่งนี้:

$numItems = count($arr);
$i = 0;
foreach($arr as $key=>$value) {
  if(++$i === $numItems) {
    echo "last index!";
  }
}    

ที่ถูกกล่าวว่าคุณไม่ต้องทำซ้ำ "array" ที่ใช้foreachใน php


ฉันคิดว่าฉันจะใช้วิธีนี้เพราะใกล้เคียงกับรหัสที่ฉันโพสต์ แม้คำตอบของ Jeremy ก็พอดี แต่ฉันคิดว่ามันซับซ้อนเล็กน้อยเมื่อเทียบกับอันนี้ ฉันไม่ได้ทำการทดสอบใด ๆ แต่ฉันเดาว่าคำตอบนี้จะเร็วขึ้นเนื่องจากไม่ได้แยกรหัสของคีย์นี่จะมีความเร็ว O (1)
Vaibhav Kamble

18
$numItems = count($arr)เคล็ดลับไม่จำเป็นและลดความสามารถในการอ่าน - ใน PHP ไม่มีการปรับประสิทธิภาพในการเข้าถึงการนับ ($ arr) ในแต่ละครั้ง เหตุผลคือจำนวนรายการถูกบันทึกภายในเป็นเขตข้อมูลพิเศษในส่วนหัวของอาร์เรย์และไม่ได้รับการคำนวณแบบทันที เคล็ดลับนี้มาจากภาษาอื่น (C, Java?, ... )
johndodo

7
น่าสนใจ @johndodo ที่ไม่มีการปรับประสิทธิภาพในการเข้าถึงการนับ ($ arr) ในแต่ละครั้ง คุณมีลิงค์ / แหล่งข้อมูลใดบ้างที่มีการบันทึกการเพิ่มประสิทธิภาพเฉพาะนี้หรือไม่ ขอบคุณ!
zuallauz

2
มันค่อนข้างเศร้าที่ใน PHP ทางออกที่ถูกต้องที่สุดสำหรับปัญหานี้ดูเหมือนจะไม่เหมาะสม :(
kizzx2

1
@tihihap $ i ต้องเพิ่มขึ้นภายในลูปควบคู่ไปกับการทำซ้ำอาร์เรย์ $ i ต้องแสดงจำนวนของไอเท็มในอาเรย์เพื่อให้สามารถใช้ในการกำหนดว่าเมื่อใดที่ไอเท็มสุดท้ายมาถึง หากไม่มี ++ การวนซ้ำจะเปรียบเทียบ "0" กับจำนวนทั้งหมดของรายการเท่านั้น
Bobby Jack

201

คุณสามารถรับค่าของคีย์สุดท้ายของอาร์เรย์โดยใช้end(array_keys($array))และเปรียบเทียบกับคีย์ปัจจุบัน:

$last_key = end(array_keys($array));
foreach ($array as $key => $value) {
    if ($key == $last_key) {
        // last element
    } else {
        // not last element
    }
}

2
+1 ฉันเห็นด้วย - โซลูชั่นอื่น ๆ ใช้อาร์เรย์ที่มีดัชนีเป็นตัวเลข
Patrick Glandien

19
ในการป้องกันของตัวเองคำตอบของฉันไม่พึ่งพาอาร์เรย์มีปุ่มตัวเลข :)
ริชาร์ด Levasseur

2
การเปรียบเทียบสตริงจะช้ากว่าจำนวนเต็มและไม่แม่นยำเสมอไปเมื่อเปรียบเทียบสตริงกับจำนวนเต็ม (อย่างน้อยคุณควรใช้ ===) ฉันกำลังลงคะแนนนี้
OIS

4
มันสวยงาม แต่ทำให้สังเกตอย่างเข้มงวดเพราะ "จบ" คาดหวังว่าค่าอ้างอิง :(
Wiliam

10
แก้ไขสำหรับข้อสังเกตที่เข้มงวด:$lastKey = array_search(end($array), $array);
Ajax

45

ทำไมจึงซับซ้อน

foreach($input as $key => $value) {
    $ret .= "$value";
    if (next($input)==true) $ret .= ",";
}

สิ่งนี้จะเพิ่ม a, อยู่เบื้องหลังทุกค่ายกเว้นค่าสุดท้าย!


2
ไม่ใช่ถ้าการป้อนข้อมูล $ ครั้งถัดไปมีค่าบูลีนเป็นเท็จซึ่งเป็นปัญหาที่สำคัญกับการถัดไป ()
soulseekah

29
ถ้าฉันเข้าใจผิดนี่ไม่ได้เพราะการโทรครั้งต่อไป () เลื่อนตัวชี้อาร์เรย์ไปดังนั้นคุณจึงข้ามองค์ประกอบอื่น ๆ ในลูปไป
Jordan Lev

2
ดูเหมือนจะไม่ได้ผลสำหรับฉัน องค์ประกอบสุดท้ายที่สองไม่ได้เครื่องหมายจุลภาค แต่ควร
zuallauz

1
หากค่าเท่ากับ bool false จะไม่ทำงาน ยังไม่พิมพ์เครื่องหมายจุลภาคสุดท้ายระหว่างค่าที่สองถึงค่าสุดท้ายและค่าสุดท้าย
OIS

1
หมายเหตุสำหรับทุกคนที่ต้องการใช้สิ่งนี้ใน PHP7 - ตัวชี้อาร์เรย์ไม่ย้ายไปอยู่ในลูป foreach และสิ่งนี้จะไม่ทำงาน
Scott Flack

26

เมื่อ toEnd ถึง 0 มันหมายความว่ามันอยู่ที่การวนซ้ำครั้งสุดท้ายของลูป

$toEnd = count($arr);
foreach($arr as $key=>$value) {
  if (0 === --$toEnd) {
    echo "last index! $value";
  }
}

ค่าสุดท้ายยังคงมีอยู่หลังจากวนรอบดังนั้นหากคุณต้องการใช้มันเพื่อเพิ่มสิ่งต่าง ๆ หลังจากวนซ้ำสิ่งนี้จะดีกว่า:

foreach($arr as $key=>$value) {
  //something
}
echo "last index! $key => $value";

หากคุณไม่ต้องการรักษาค่าสุดท้ายเป็นลูปพิเศษภายใน ควรจะเร็วกว่านี้ถ้าคุณมีอาร์เรย์ขนาดใหญ่ (ถ้าคุณใช้อาร์เรย์ซ้ำหลังจากวนรอบภายในขอบเขตเดียวกันคุณต้อง "คัดลอก" อาร์เรย์ก่อน)

//If you use this in a large global code without namespaces or functions then you can copy the array like this:
//$array = $originalArrayName; //uncomment to copy an array you may use after this loop

//end($array); $lastKey = key($array); //uncomment if you use the keys
$lastValue = array_pop($array);

//do something special with the last value here before you process all the others?
echo "Last is $lastValue", "\n";

foreach ($array as $key => $value) {
    //do something with all values before the last value
    echo "All except last value: $value", "\n";
}

//do something special with the last value here after you process all the others?
echo "Last is $lastValue", "\n";

และเพื่อตอบคำถามเดิมของคุณ "ในกรณีของฉันเพื่อผนวกหรือ / และพารามิเตอร์ขณะสร้างคิวรี"; สิ่งนี้จะวนซ้ำค่าทั้งหมดจากนั้นรวมเข้าด้วยกันเป็นสตริงด้วย "และ" ระหว่างค่าเหล่านั้น แต่ไม่ใช่ก่อนหน้าค่าแรกหรือหลังค่าสุดท้าย:

$params = [];
foreach ($array as $value) {
    $params[] = doSomething($value);
}
$parameters = implode(" and ", $params);

2
แน่นอนว่ามันจะทำการ - $ toEnd สำหรับทุกการวนซ้ำนั่นคือประเด็น ถ้าฉันย้ายออกไปนอกวงมันจะไม่ทำงานอีกต่อไป
OIS

วิธีที่ง่ายที่สุดที่เคยใช้ $lastValue = array_pop($array);ขอบคุณ.
Elias Nicolas

21

มีคำตอบมากมายอยู่แล้ว แต่ก็คุ้มค่าที่จะพิจารณาตัววนซ้ำเช่นกันโดยเฉพาะอย่างยิ่งเมื่อถูกถามถึงวิธีมาตรฐาน:

$arr = range(1, 3);

$it = new CachingIterator(new ArrayIterator($arr));
foreach($it as $key => $value)
{
  if (!$it->hasNext()) echo 'Last:';
  echo $value, "\n";
}

คุณอาจพบบางสิ่งที่ทำงานได้ยืดหยุ่นกว่าในกรณีอื่นเช่นกัน


คำตอบที่ดี ฉันขอขอบคุณที่คุณกำลังใช้คุณสมบัติของภาษาที่มีไว้สำหรับงาน i=0;และ++i;ดูเหมือนจะแฮ็คเสมอในภาษาสคริปต์เช่น PHP
CheddarMonkey

15

วิธีหนึ่งคือตรวจสอบว่าตัววนซ้ำมีnextหรือไม่ หากไม่มีการต่อกับตัววนซ้ำถัดไปหมายความว่าคุณอยู่ในลูปสุดท้าย

foreach ($some_array as $element) {
    if(!next($some_array)) {
         // This is the last $element
    }
}

ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดและต้องการรหัสจำนวนน้อยที่สุด!
สวัสดี im zvaehn

1
ไม่ทำงานกับ PHP 7+ เป็น "ใน PHP 7 foreach ไม่ได้ใช้ตัวชี้อาร์เรย์ภายใน"
Damien Debin

8

ดังนั้นถ้าอาเรย์ของคุณมีค่าอาเรย์ที่ไม่ซ้ำกันการพิจารณาการวนซ้ำครั้งล่าสุดนั้นเป็นเรื่องเล็กน้อย:

foreach($array as $element) {
    if ($element === end($array))
        echo 'LAST ELEMENT!';
}

ตามที่คุณเห็นมันจะทำงานถ้าองค์ประกอบสุดท้ายปรากฏเพียงหนึ่งครั้งในอาร์เรย์มิฉะนั้นคุณจะได้รับการเตือนที่ผิดพลาด ในนั้นไม่ได้คุณต้องเปรียบเทียบคีย์ (ซึ่งเป็นเอกลักษณ์แน่นอน)

foreach($array as $key => $element) {
    end($array);
    if ($key === key($array))
        echo 'LAST ELEMENT!';
}

โปรดสังเกตว่าตัวดำเนินการ coparision ที่เข้มงวดซึ่งค่อนข้างสำคัญในกรณีนี้


นี่เป็นวิธีที่ค่อนข้างไม่มีประสิทธิภาพ
สามัญสำนึกของคุณ

Nope มันไม่ใช่. end () ดำเนินการ O (1) มันสั้นกว่าโซลูชันอื่น ๆ และอ่านออกมาอย่างดี -> ถ้าองค์ประกอบเท่ากับจุดจบของอาร์เรย์ให้เขียนว่า "Last"
Rok Kralj

นี่ช้ากว่าสองเท่าอย่างที่ฉันทำครั้งแรกและตัวอย่างสุดท้ายสำหรับค่า 100,000
OIS

5

สมมติว่าคุณมีอาร์เรย์เก็บไว้ในตัวแปร ...

foreach($array as $key=>$value) 
{ 
    echo $value;
    if($key != count($array)-1) { echo ", "; }
}

ง่ายและมีประโยชน์มาก ฉันจะนับเฉพาะลำดับแรกนอกลูป foreach เพื่อให้โปรแกรมไม่ต้องนับทุกครั้งที่ฟังก์ชั่น foreach ทำการประเมินแต่ละไอเท็ม
Pathros

3
สิ่งนี้จะไม่ทำงานในอาร์เรย์ที่เชื่อมโยงกัน $ key อาจไม่ใช่ตัวเลขเสมอไป
Jonathan

5

ที่จะได้รับองค์ประกอบแรกและสุดท้ายจากอาร์เรย์ foreach

foreach($array as $value) {
    if ($value === reset($array)) {
        echo 'FIRST ELEMENT!';
    }

    if ($value === end($array)) {
        echo 'LAST ITEM!';
    }
}

4

คุณยังสามารถใช้วิธีการนั้นกับอาเรย์แบบเชื่อมโยง:

$keys = array_keys($array);
for ($i = 0, $l = count($array); $i < $l; ++$i) {
    $key = $array[$i];
    $value = $array[$key];
    $isLastItem = ($i == ($l - 1));
    // do stuff
}

// or this way...

$i = 0;
$l = count($array);
foreach ($array as $key => $value) {
    $isLastItem = ($i == ($l - 1));
    // do stuff
    ++$i;
}

1
กรุณาเปลี่ยน $ key = $ array [$ i]; ถึง $ key = $ keys [$ i]; ในครั้งแรกสำหรับวง
Narek

4

หากคุณต้องการทำบางสิ่งบางอย่างสำหรับทุกองค์ประกอบยกเว้นทั้งตัวแรกและตัวสุดท้ายและเฉพาะในกรณีที่มีมากกว่าหนึ่งองค์ประกอบในอาร์เรย์ฉันชอบวิธีต่อไปนี้

ฉันรู้ว่ามีวิธีแก้ปัญหาหลายอย่างข้างต้นและโพสต์เดือน / หนึ่งปีก่อนหน้าของฉัน แต่นี่คือสิ่งที่ฉันรู้สึกว่าค่อนข้างสง่างามในสิทธิของตนเอง การตรวจสอบทุกลูปเป็นการตรวจสอบบูลีนซึ่งต่างจากการตรวจสอบตัวเลข "i = (นับ -1)" ซึ่งอาจทำให้ค่าใช้จ่ายน้อยลง

โครงสร้างของลูปอาจรู้สึกอึดอัดใจ แต่คุณสามารถเปรียบเทียบกับการเรียงลำดับของ thead (เริ่มต้น), tfoot (สิ้นสุด), tbody (ปัจจุบัน) ในแท็กตาราง HTML

$first = true;
foreach($array as $key => $value) {
    if ($first) {
        $first = false;
        // Do what you want to do before the first element
        echo "List of key, value pairs:\n";
    } else {
        // Do what you want to do at the end of every element
        // except the last, assuming the list has more than one element
        echo "\n";
    }
    // Do what you want to do for the current element
    echo $key . ' => ' . $value;
}

ตัวอย่างเช่นในแง่การพัฒนาเว็บหากคุณต้องการเพิ่มเส้นขอบด้านล่างให้กับทุกองค์ประกอบยกเว้นรายการสุดท้ายในรายการที่ไม่เรียงลำดับ (ul) คุณสามารถเพิ่มเส้นขอบด้านบนลงในทุกองค์ประกอบยกเว้นองค์ประกอบแรก (CSS: ลูกคนแรกได้รับการสนับสนุนโดย IE7 + และ Firefox / Webkit สนับสนุนตรรกะนี้ในขณะที่: ลูกคนสุดท้ายไม่ได้รับการสนับสนุนโดย IE7)

คุณสามารถนำตัวแปร $ first มาใช้ซ้ำสำหรับแต่ละลูปที่ซ้อนกันได้และทุกอย่างจะทำงานได้ดีเนื่องจากทุกลูปจะทำให้ $ First เป็นเท็จในระหว่างกระบวนการแรกของการทำซ้ำครั้งแรก (ดังนั้นการแบ่ง / ข้อยกเว้นจะไม่ทำให้เกิดปัญหา) .

$first = true;
foreach($array as $key => $subArray) {
    if ($first) {
        $string = "List of key => value array pairs:\n";
        $first = false;
    } else {
        echo "\n";
    }

    $string .= $key . '=>(';
    $first = true;
    foreach($subArray as $key => $value) {
        if ($first) {
            $first = false;
        } else {
            $string .= ', ';
        }
        $string .= $key . '=>' . $value;
    }
    $string .= ')';
}
echo $string;

ตัวอย่างผลลัพธ์:

List of key => value array pairs:
key1=>(v1_key1=>v1_val1, v1_key2=>v1_val2)
key2=>(v2_key1=>v2_val1, v2_key2=>v2_val2, v2_key3=>v2_val3)
key3=>(v3_key1=>v3_val1)

ขอบคุณมากนี่เป็นคำตอบที่ฉันโปรดปราน! มันมีความยืดหยุ่นและค่าใช้จ่ายเป็นบูลีนเท่านั้น BTW ฉันคิดว่าสิ่งนี้จะใช้ได้กับอาร์เรย์ที่มีองค์ประกอบอย่างน้อยหนึ่งองค์ประกอบด้วย (ไม่เพียงมากกว่าหนึ่งองค์ประกอบ)
jc

4

นี่ควรเป็นวิธีที่ง่ายในการค้นหาองค์ประกอบสุดท้าย:

foreach ( $array as $key => $a ) {
    if ( end( array_keys( $array ) ) == $key ) {
        echo "Last element";
     } else {
        echo "Just another element";
     }
}  

อ้างอิง: ลิงค์


- ลิงก์เสีย -
T30

3

ฉันมีความรู้สึกที่แข็งแกร่งที่รากของ "ปัญหา XY" นี้ OP ต้องการเพียงแค่การimplode()ทำงาน


1
จริง มีบางกรณีที่ซึ่งการระเบิดไม่ได้เกิดขึ้นจริง ลองจินตนาการถึงตัวอย่างที่พยายามจะแปลสตริง html ที่มีความยาวพร้อมกับตัวแปรแบบไดนามิกจำนวนมาก แน่นอนว่าคุณสามารถทำ ob_start / ob_get_clean ได้หรือสร้างเป็น $ str = '... ' แต่มีบางครั้งที่สิ่งนี้ถือได้ว่าเป็นเรื่องเกินตัวมากเกินไป
Alastair Brayne

3

ตามที่คุณต้องการในการค้นหาอาร์เรย์ EOF เป็นเพียงกาว รับการแนะนำให้รู้จักกับชั้นเชิงด้านล่าง คุณไม่จำเป็นต้องมี EOF:

$given_array = array('column1'=>'value1',
                     'column2'=>'value2',
                     'column3'=>'value3');

$glue = '';
foreach($given_array as $column_name=>$value){
    $where .= " $glue $column_name = $value"; //appending the glue
    $glue   = 'AND';
}
echo $where;

o / p:

column1 = value1 AND column2 = value2 AND column3 = value3


2

ดูเหมือนว่าคุณต้องการสิ่งนี้:

$array = array(
    'First',
    'Second',
    'Third',
    'Last'
);

foreach($array as $key => $value)
{
    if(end($array) === $value)
    {
       echo "last index!" . $value;
    }
}

2
การใช้ค่ามักไม่ใช่ความคิดที่ดีเพราะมันจะทำงานไม่ถูกต้องหากอาร์เรย์มีค่าที่เหมือนกันสองค่า
orrd

2

อย่าเพิ่มเครื่องหมายจุลภาคหลังค่าสุดท้าย:

อาร์เรย์:

$data = ['lorem', 'ipsum', 'dolor', 'sit', 'amet'];

ฟังก์ชั่น:

$result = "";
foreach($data as $value) {
    $resut .= (next($data)) ? "$value, " : $value;
}

ผลลัพธ์:

print $result;

Lorem, ipsum, dolor, นั่ง, amet


1

คุณสามารถนับได้ ()

for ($i=0;$i<count(arr);$i++){
    $i == count(arr)-1 ? true : false;
}

หรือหากคุณกำลังมองหาเฉพาะองค์ประกอบสุดท้ายคุณสามารถใช้ end ()

end(arr);

ส่งกลับเฉพาะองค์ประกอบสุดท้าย

และตามที่ปรากฏออกมาคุณสามารถสร้างดัชนีอาร์เรย์ PHP ด้วยจำนวนเต็ม มันมีความสุขอย่างสมบูรณ์แบบด้วย

arr[1];

1
ข้อเสียเปรียบในท้าย (ARR) คือจะกำหนดตัวชี้ภายในอาร์เรย์ขององค์ประกอบที่ผ่านมา ..
วีเจย์

ไม่คุณไม่ควรใช้จำนวนเต็มเพื่อเข้าถึงอาร์เรย์ยกเว้นว่าคุณรู้ว่าปุ่มนั้นเป็นตัวเลขและเรียงตามลำดับ พิจารณา: $a = array(0=>'A', 2=>'B', 'aaa'=>'C'). คุณได้อะไรถ้าคุณเข้าถึง$a[count($a)-1]?
johndodo

1

คุณสามารถทำสิ่งนี้:

end( $elements );
$endKey = key($elements);
foreach ($elements as $key => $value)
{
     if ($key == $endKey) // -- this is the last item
     {
          // do something
     }

     // more code
}

end ส่งคืนค่าไม่ใช่อาร์เรย์ดังนั้นวิธีที่คุณทำให้มันใช้งานไม่ได้ การเปรียบเทียบสตริงยังช้ากว่าและเป็นจำนวนเต็ม
OIS

คุณพูดถูก มันควรจะสิ้นสุด ($ องค์ประกอบ); $ endKey = key ($ elements);
KOGI

1

ฉันชอบสิ่งต่อไปนี้เพราะฉันรู้สึกว่ามันค่อนข้างเรียบร้อย สมมติว่าเรากำลังสร้างสตริงที่มีตัวคั่นระหว่างองค์ประกอบทั้งหมด: เช่น a, b, c

$first = true;
foreach ( $items as $item ) {
    $str = ($first)?$first=false:", ".$item;
}

ทำให้มันง่ายขึ้นโดยไม่ต้องประกาศ $ first; ใช้ foreach ($ items เป็น $ key => $ item) จากนั้น $ str = ($ key == 0)?
Milan Rilex Ristic


0

นี่เป็นอีกวิธีที่คุณสามารถทำได้:

$arr = range(1, 10);

$end = end($arr);
reset($arr);

while( list($k, $v) = each($arr) )
{
    if( $n == $end )
    {
        echo 'last!';
    }
    else
    {
        echo sprintf('%s ', $v);
    }
}

0

ถ้าฉันเข้าใจคุณทั้งหมดที่คุณต้องมีก็คือการย้อนกลับอาร์เรย์และรับองค์ประกอบสุดท้ายโดยคำสั่ง pop:

   $rev_array = array_reverse($array);

   echo array_pop($rev_array);

0

คุณสามารถลองทำสิ่งนี้เพื่อสอบถาม ... แสดงที่นี่ด้วย INSERT

<?php
 $week=array('one'=>'monday','two'=>'tuesday','three'=>'wednesday','four'=>'thursday','five'=>'friday','six'=>'saturday','seven'=>'sunday');
 $keys = array_keys($week);
 $string = "INSERT INTO my_table ('";
 $string .= implode("','", $keys);
 $string .= "') VALUES ('";
 $string .= implode("','", $week);
 $string .= "');";
 echo $string;
?>

0

สำหรับสคริปต์ที่สร้างคิวรี SQL หรือสิ่งใดก็ตามที่ทำการกระทำที่แตกต่างกันสำหรับองค์ประกอบแรกหรือองค์ประกอบสุดท้ายจะเร็วกว่ามาก (เกือบสองเท่าเร็ว) เพื่อหลีกเลี่ยงการใช้การตรวจสอบตัวแปรที่ไม่จำเป็น

โซลูชันที่ยอมรับในปัจจุบันใช้การวนซ้ำและการตรวจสอบภายในลูปที่จะทำ every_single_iteration วิธีที่ถูกต้อง (เร็ว) ในการทำเช่นนี้มีดังต่อไปนี้:

$numItems = count($arr);
$i=0;
$firstitem=$arr[0];
$i++;
while($i<$numItems-1){
    $some_item=$arr[$i];
    $i++;
}
$last_item=$arr[$i];
$i++;

มาตรฐานโฮมเมดเล็ก ๆ น้อย ๆ แสดงให้เห็นต่อไปนี้:

test1: 100,000 รุ่นของ morg

เวลา: 1869.3430423737 มิลลิวินาที

test2: 100,000 รุ่นที่รันล่าสุด

เวลา: 3235.6359958649 มิลลิวินาที


0

อีกวิธีที่จะไปคือการจำผลลัพธ์วงรอบก่อนหน้าและใช้มันเป็นผลลัพธ์สุดท้าย:

    $result = $where = "";
    foreach ($conditions as $col => $val) {
        $result = $where .= $this->getAdapter()->quoteInto($col.' = ?', $val);
        $where .=  " AND ";
    }
    return $this->delete($result);

0

ฉันเองใช้การก่อสร้างประเภทนี้ซึ่งทำให้ใช้งานง่ายด้วยองค์ประกอบ html <ul> และ <li>: เพียงแค่เปลี่ยนความเท่าเทียมกันสำหรับคุณสมบัติอื่น ...

อาร์เรย์ไม่สามารถมีรายการที่เป็นเท็จ แต่รายการอื่น ๆ ทั้งหมดที่ถูกโยนลงในบูลีนเท็จ

$table = array( 'a' , 'b', 'c');
$it = reset($table);
while( $it !== false ) {
    echo 'all loops';echo $it;
    $nextIt = next($table);
    if ($nextIt === false || $nextIt === $it) {
            echo 'last loop or two identical items';
    }
    $it = $nextIt;
}


0
<?php foreach($have_comments as $key => $page_comment): ?>
    <?php echo $page_comment;?>
    <?php if($key+1<count($have_comments)): ?> 
        <?php echo ', '; ?>
    <?php endif;?>
<?php endforeach;?>

0

นี่คือวิธีแก้ปัญหาของฉัน: เพียงนับจำนวนอาร์เรย์ของคุณลบ 1 (ตั้งแต่เริ่มใน 0)

$lastkey = count($array) - 1;
foreach($array as $k=>$a){
    if($k==$lastkey){
        /*do something*/
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.