web-dev-qa-db-ja.com

PHPでforeachループを使用しながら配列の最後の要素を見つける

私はいくつかのパラメータを使用してSQLクエリ作成者を書いています。 Javaでは、配列の長さで現在の配列位置をチェックするだけで、forループの内側から配列の最後の要素を検出するのは非常に簡単です。

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

PHPには、配列にアクセスするための非整数インデックスがあります。そのため、foreachループを使用して配列を反復処理する必要があります。これはあなたが何らかの決断をする必要があるときに問題になります(私の場合はクエリを構築している間に/またはパラメータを追加します)。

これを行うための標準的な方法があるはずです。

これをPHPでどのように解決しますか?

191
Vaibhav Kamble

あなたはこのようなものが欲しいようですね。

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

とはいえ、phpでforeachを使って「配列」を反復する必要はありません。

281

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
    }
}
188
Jeremy Ruten

なぜそんなに複雑なのですか?

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

これにより、最後の値を除くすべての値の後ろにaが追加されます。

39
Trikks

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";

そして、あなたの最初の質問に答えるために、「私の場合は、クエリを構築している間に追加または/およびパラメータを設定する」。これはすべての値をループし、それらの間に "and"を入れて、最初の値の前や最後の値の後ではない文字列に結合します。

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

すでに多くの答えがありますが、特に標準的な方法が求められているので、イテレータにも注目する価値があります。

$arr = range(1, 3);

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

他の場合にももっと柔軟に機能するものがあるかもしれません。

20
hakre

1つの方法は、イテレータにnextがあるかどうかを検出することです。反復子に次の添付がない場合は、最後のループにいるということです。

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

そのため、配列に一意の配列値がある場合、最後の反復を判断するのは簡単です。

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!';
}

この場合は非常に重要である厳密な共射演算子にも注意してください。

8
Rok Kralj

配列が変数に格納されているとします。

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

最初または最後の要素を除くすべての要素に対して、配列に複数の要素がある場合にのみ何かを実行する必要がある場合は、次の解決策をお勧めします。

私は上に多くの解決策があり、私の前に1ヶ月/ 1ヶ月投稿したことを知っています、しかしこれは私がそれ自体でかなり優雅であると感じるものです。ループごとのチェックは、数値の "i =(count-1)"チェックとは対照的に、ブール値のチェックでもあるため、オーバーヘッドが少なくなります。

ループの構造はぎこちなく感じるかもしれませんが、HTMLテーブルタグのthead(開始)、tfoot(終了)、tbody(現在)の順序と比較することができます。

$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;
}

たとえば、Web開発の用語で、番号なしリストの最後の要素を除くすべての要素にborder-bottomを追加する場合は、代わりにborder-を追加できます。 first(IE7 +およびFirefox/WebkitでサポートされているCSS:first-childはこのロジックをサポートしていますが、IE7ではサポートされていません)。

最初の繰り返しの最初のプロセスではすべてのループが$ firstをfalseにするので、入れ子になったループごとに$ 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)
4
Ankit Aggarwal

これは最後の要素を見つける簡単な方法です。

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

参照: リンク

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;
}
3
nickf

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
3
Angelin Nadar

私はこの「XY問題」の根本にあるOPがimplode()関数だけを望んでいたことを強く感じます。

3

あなたがこのようなものが欲しいようですね

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

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

次のようなこともできます。

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

     // more code
}
1
KOGI

私はそれがかなりきちんとしていると思うので私はちょっと次のようにちょっと好きです。すべての要素の間に区切り文字を含む文字列を作成しているとしましょう。 a、b、c

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

あなたはcount()をすることができます。

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

または最後の要素のみを探している場合は、end()を使用できます。

end(arr);

最後の要素だけを返します。

そして結局のところ、あなたは整数でphp配列にインデックスを付けることができます。それは完全に幸せです

arr[1];
1
helloandre

「end」を使ってはどうですか? http://php.net/manual/en/function.end.php

1
Çağ
foreach ($array as $key => $value) {

  $class = ( $key !== count( $array ) -1 ) ? " class='not-last'" : " class='last'";

  echo "<div{$class}>";
  echo "$value['the_title']";
  echo "</div>";

}

参考

1
Ayman Elshehawy

end()関数によるより簡単な関数はPHPの組み込み関数であり、与えられた配列の最後の要素を見つけるために使われます。 end()関数は、配列の内部ポインタを最後の要素を指すように変更し、最後の要素の値を返します。

以下は、非整数インデックスの例です。

<?php
    $arr = array(
            'first' => 
                array('id' => 1, 'label' => 'one'), 
            'second' => 
                array('id' => 2, 'label' => 'two'), 
            'last' => 
                array('id' => 9, 'label' => 'nine')
        );
    $lastIndexArr = end($arr);
    print_r($lastIndexArr);

ここをチェック 出力としての最後の配列。

0
Bunker Boy

これがあなたがそれをすることができるもう一つの方法です:

$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
Kevin

これが私の解決策です。単純にあなたの配列の数から1を引いたものです(0から始まるので)。

$lastkey = count($array) - 1;
foreach($array as $k=>$a){
    if($k==$lastkey){
        /*do something*/
    }
}
0
ITWitch

私があなたを理解しているならば、あなたが必要とするすべてはpopコマンドで配列を逆にして、最後の要素を得ることです:

   $rev_array = array_reverse($array);

   echo array_pop($rev_array);
0
James

もう1つの方法は、前のループサイクルの結果を覚えておき、それを最終結果として使用することです。

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

次の方法で直接インデックスを取得できます。

$numItems = count($arr);

echo $arr[$numItems-1];

0
Denis Omeri

foreach配列から最初と最後の要素を取得する

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

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

最後の値の後にコンマを追加しないでください。

配列:

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

機能:

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

結果:

print $result;

lorem、イプサム、dolor、座る、amet

0
Santo Boldižar

SQLクエリ生成スクリプト、または最初または最後の要素に対して異なるアクションを実行するスクリプトでは、不要な変数チェックを使用しない方がはるかに高速です(ほぼ2倍の速さ)。

現在認められている解決策は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:モデルmorgの100000回の実行

時間:1869.3430423737ミリ秒

test2:最後の場合はモデルの100000回の実行

時間:3235.6359958649ミリ秒

0
Morg.
<?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
Zarpele

これを試してクエリを作成することもできます。

<?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
Mark

私は個人的にhtml <ul>と<li>要素で簡単に使えるようにするこの種の構造を使います:単に他のプロパティの等価性を変えるだけで...

配列にfalseの項目を含めることはできませんが、falseのブール値にキャストされる他のすべての項目を含めることはできません。

$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
MUY Belgium

この簡単な解決策を試してください

$test = ['a' => 1, 'b' => 2, 'c' => 3];

$last_array_value = end($test);

foreach ($test as $key => $value) {
   if ($value === $last_array_value) {
      echo $value; // display the last value  
   } else {
     echo $value; // display the values that are not last elements 
   }
}
0
1247p