Bir dizi döngü içinde 1 tuşuna atlamak nasıl?

10 Cevap php

Ben aşağıdaki kodu vardır:

if ($_POST['submit'] == "Next") {
    foreach($_POST['info'] as $key => $value) {
    	echo $value;
    }
}

Nasıl foreach işlevi dizideki 2. tuşu başlamak alabilirim? Thanx.

10 Cevap

Makul küçük diziler için, array_slice, ikinci bir tane oluşturmak için kullanabilirsiniz:

foreach(array_slice($_POST['info'],1) as $key=>$value)
{
    echo $value;
}
foreach(array_slice($_POST['info'], 1) as $key=>$value) {
    echo $value;
}

Eğer diziyi kopyalamak istemiyorsanız Alternatif eğer sadece yapabileceği:

$isFirst = true;
foreach($_POST['info'] as $key=>$value) {
    if ($isFirst) {
        $isFirst = false;
        continue;
    }   
    echo $value;
}

Normal bir dizi çalışma olsaydı, ben gibi bir şey kullanmak için söyleyebilirim

foreach (array_slice($ome_array, 1) as $k => $v {...

Eğer bir kullanıcının isteği bakıyoruz ama beri, sen argümanlar iade olabilir hangi sırayla herhangi bir gerçek garanti yok - bazı tarayıcı / vekil onun davranışını değiştirmek olabilir veya sadece formunuzu değiştirmeye karar verebilir gelecek. Her iki durumda da, bu dizinin sıralamasını göz ardı ve size iki seçenek bırakarak, sırasız bir karma harita olarak POST değerleri tedavi etmek için en iyi ilgi var:

  • dizi kopyalayın ve unset tuşuna görmezden istiyorum
  • tüm dizi ve continue döngü görmezden istediğiniz anahtarını görünce

Sadece dizi unset olamazdı ...

So if I had an array where I didn't want the first instance, I could just:

unset($array[0]);

ve bu diziden örneğini kaldırmak istiyorsunuz.

Uzakta ilk öğeyi atmak için istekli iseniz, kullanabilirsiniz array_shift(). Ancak, bu büyük bir dizi üzerinde yavaş. Daha hızlı bir işlem olacaktır

reset($a);
unset(key($a));

döngü içinde:

if ($key == 0) //or whatever
   continue;

1000 elemanları ile dolu bir dizi üzerinde fark oldukça az.

Test:

<?php
function slice($a)
{
    foreach(array_slice($a, 1) as $key)
    {

    }

    return true;
}

function skip($a)
{
    $first = false;

    foreach($a as $key)
    {
    	if($first)
    	{
    		$first = false;
    		continue;
    	}
    }

    return true;
}

$array = array_fill(0, 1000, 'test');

$t1 = time() + microtime(true);

for ($i = 0; $i < 1000; $i++)
{
    slice($array);
}

var_dump((time() + microtime(true)) - $t1);

echo '<hr />';

$t2 = time() + microtime(true);

for ($i = 0; $i < 1000; $i++)
{
    skip($array);
}

var_dump((time() + microtime(true)) - $t2);
?>

Output:

şamandıra (0,23605012893677)

şamandıra (0,24102783203125)

Alternatif bir yol dizi işaretçileri kullanmak için:

reset($_POST['info']); //set pointer to zero
while ($value=next($_POST['info'])  //ponter+1, return value
{
  echo key($_POST['info']).":".$value."\n";
}

Eğer farklı form yapısı ise

  <input type='text' name='quiz[first]' value=""/>
  <input type='text' name='quiz[second]' value=""/>

... Sonra PHP

if( isset($_POST['quiz']) AND 
    is_array($_POST['quiz'])) {

    //...and we'll skip $_POST['quiz']['first'] 
    foreach($_POST['quiz'] as $key => $val){
      if($key == "first") continue;
      print $val; 
    }
}

... Bu özel yapısı ve normal erişim kalanı üzerinde yapabilirsiniz şimdi sadece döngü

Nasıl böyle bir şey? O array_shift() (EDIT: Don't use array_shift(), bu yeniden numaralandırılır diziden ön elemanı sıradan çıkarma için, key() ve current() kullanılarak birinci anahtarı ve değerini okuyun Her zaman istemediğiniz dizisindeki herhangi bir sayısal endeksleri!).

    <?php

    $arr = array(

      'one' => "ONE!!",
      'two' => "TWO!!",
      'three' => "TREE",
      4 => "Fourth element",
      99 => "We skipped a few here.."

    ) ;

    $firstKey = key( $arr ) ;
    $firstVal = current( $arr ) ;

    echo( "

Tamam, ilk değerler $ firstKey, $ firstVal

" ) ; ####array_shift( $arr ) ; #'dequeue' front element # BAD! renumbers! unset( $arr[ $firstKey ] ) ; # BETTER! echo( "

Şimdi bunların geri kalanı için

" ) ; foreach( $arr as $key=>$val ) { echo( "

$ Anahtar => $ val

" ) ; } ?>