241

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

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

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

これを行う標準的な方法があるに違いないと確信しています。

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

4

35 に答える 35

348

次のようなものが欲しいようです:

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

foreachそうは言っても、php を使用して「配列」を反復処理する必要はありません。

于 2009-03-20T06:05:36.153 に答える
215

を使用して配列の最後のキーの値を取得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
    }
}
于 2009-03-20T06:07:08.613 に答える
52

: next() を呼び出すと配列ポインターが進むため、これは機能しません。そのため、ループ内の他のすべての要素をスキップしています。


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

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

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

于 2009-12-14T14:52:04.310 に答える
28

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

そして、元の質問に答えるには、「私の場合、クエリの作成中に or/and パラメータを追加します」; これはすべての値をループし、それらを " と " で区切って文字列に結合しますが、最初の値の前または最後の値の後ではありません。

$params = [];
foreach ($array as $value) {
    $params[] = doSomething($value);
}
$parameters = implode(" and ", $params);
于 2009-03-20T09:02:01.237 に答える
22

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

$arr = range(1, 3);

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

他のケースでもより柔軟に機能するものを見つけるかもしれません。

于 2011-10-11T01:25:05.513 に答える
11

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

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

    if ($value === end($array)) {
        echo 'LAST ITEM!';
    }
}
于 2019-07-22T06:37:35.793 に答える
8

したがって、配列に一意の配列値がある場合、最後の反復を決定するのは簡単です。

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

ご覧のとおり、最後の要素が配列に 1 回だけ表示されている場合、これは機能します。そうでない場合は、誤ったアラームが発生します。そうでない場合は、キーを比較する必要があります(確かに一意です)。

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

この場合、非常に重要な厳密な比較演算子にも注意してください。

于 2012-04-21T07:11:59.833 に答える
5

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

foreach($array as $key=>$value) 
{ 
    echo $value;
    if($key != count($array)-1) { echo ", "; }
}
于 2012-10-09T11:38:27.550 に答える
5

連想配列でそのメソッドを引き続き使用できます。

$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;
}
于 2009-03-20T06:54:57.717 に答える
4

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

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

参考:リンク

于 2014-05-22T10:42:32.410 に答える
4

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

上記の多くの解決策があり、私の投稿の数か月または 1 年前に投稿されていることは知っていますが、これはそれ自体でかなりエレガントだと感じているものです。ループごとのチェックは、数値の「i=(count-1)」チェックとは対照的に、ブール値のチェックでもあり、オーバーヘッドが少なくなる可能性があります。

ループの構造がぎこちなく感じるかもしれませんが、HTML の table タグの 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 開発用語で、順序付けられていないリスト (ul)の最後の要素を除くすべての要素に border-bottom を追加する場合、代わりに最初の要素を除くすべての要素に border-top を追加できます(CSS : IE7+ でサポートされている first-child と Firefox/Webkit はこのロジックをサポートしていますが、:last-child は IE7 ではサポートされていません)。

ネストされたループごとに $first 変数を自由に再利用することもできます。最初の反復の最初のプロセスですべてのループが $first を false にするため、問題なく動作します (したがって、ブレーク/例外は問題を引き起こしません)。 .

$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)
于 2010-03-18T16:25:31.830 に答える
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
于 2013-04-06T05:24:21.730 に答える
3

この「XY問題」の根底にあるのは、OPがただ機能したかったという強い気持ちですimplode()

于 2012-04-21T07:22:18.973 に答える
2

次のようなものが欲しいようです:

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

foreach($array as $key => $value)
{
    if(end($array) === $value)
    {
       echo "last index!" . $value;
    }
}
于 2011-09-22T06:38:11.337 に答える
2

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

于 2010-06-08T13:48:07.227 に答える
1

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

$first = true;
foreach ( $items as $item ) {
    $str = ($first)?$first=false:", ".$item;
}
于 2013-07-16T17:28:16.790 に答える
1

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

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

     // more code
}
于 2009-03-30T19:14:51.883 に答える
1

count() を実行できます。

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

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

end(arr);

最後の要素のみを返します。

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

arr[1];
于 2009-03-20T06:05:26.853 に答える
0

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

$numItems = count($arr);

echo $arr[$numItems-1];

于 2012-08-16T13:59:23.847 に答える
0

私があなたを理解していれば、必要なのは配列を逆にして、ポップコマンドで最後の要素を取得することだけです:

   $rev_array = array_reverse($array);

   echo array_pop($rev_array);
于 2010-04-08T16:13:41.947 に答える
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);
    }
}
于 2009-12-09T23:52:31.600 に答える
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;
?>
于 2010-11-05T20:27:45.993 に答える
0

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 ミリ秒

于 2011-08-09T13:29:14.820 に答える
0

私は個人的に、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;
}
于 2012-04-05T09:06:34.223 に答える
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;?>
于 2012-11-21T14:19:01.970 に答える
0

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

    $result = $where = "";
    foreach ($conditions as $col => $val) {
        $result = $where .= $this->getAdapter()->quoteInto($col.' = ?', $val);
        $where .=  " AND ";
    }
    return $this->delete($result);
于 2012-03-11T21:52:28.883 に答える
0

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

$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 
   }
}
于 2019-02-13T09:56:52.117 に答える