2010-12-10 13 views
1

これは実際にはCSSの質問かもしれませんが、私はこれがIEで動作するようにしたいと思います。PHPループ、最後の項目を変更しますか?

私は、次のループがあります。

出力

アイテム、アイテム、アイテム、アイテム、

唯一のものがあるが...私が持っていたいと思いすべき

<?php 
    if ($category) 
{ 
    foreach($category as $item) 
     { 
       echo $item['name']; 
       echo ", "; 
     } 
} ?> 

を最後の項目の後のカンマ。ループ内でこれを行う方法はありますか?あるとして素敵foreachとして

+2

'エコー($カテゴリが)'ところで間違っている場合。ちょうど 'if($ category)'です。 –

+0

私はちょうど編集をしました。 – redconservatory

答えて

7

コードをそのまま残しておけば、カウンタを追加して最後のものをスキップすることができます。

<?php 
if ($category) { 
    $counter = 0; 
    foreach($category as $item) 
     { 
       $counter++; 
       echo $item['name']; 
       if ($counter < count($category)) { 
        echo ", "; 
       } 
     } 
} 
?> 

それともずっと、ずっと、迅速にそれを行うことができます。

編集:を逃した

<?php echo implode(", ", array_map(create_function('$item', 'return $item["name"];'), $category)); ?> 
+1

+1 'implode'(ただし、あなたのコードには引用符に関するいくつかのエラーがあります)。 'count()'の値をキャッシュするほうが良いと思います。 –

+1

+1非常に滑らかな1ライナー:) – Jonah

+0

なぜ 'create_function'ですか? 'implode'は、OPが望んでいることをすべて迷惑にならないようにしているようだ... –

1

、...

<?php 
if ($category) { 
    $count = count($category) - 1; 
    for ($i = 0; $i <= $count; $i++) { 
     echo $category[$i]['name']; 
     if ($i < $count) 
      echo ', '; 
    } 
} 
?> 

... forは時々必要です。

+1

'for'はここでは必要ありません。 Orblingの答えを参照してください。実際、この場合はループは必要ありません。 – treeface

+1

@Treeface:OPは具体的に "ループ内でこれを行う方法はありますか?" –

+2

@Billy ONeal:はい、しかし、彼はおそらく "_itはループの中にいなければなりません"という意味ではありませんでした。 – Jonah

1

$category配列されたと仮定すると、あなたが望む結果を得るためにimplodeを使用することができます$ categories ['name']の部分では、これはうまくいくはずです:

<?php implode(", ", array_keys($category, 'name')); ?> 
+0

これはうまくいくが、 '$ item'だけでなく、' $ item ['name'] 'を出力する必要がある。 – Jonah

+1

私はあなたが 'array_keys'が何をしているのか誤解していると思います。 '$ item ['name']'の値はあなたに与えられません。 '$ categories'は少なくとも2次元の配列であることにも注意してください。アイテムと各アイテムが少なくともエントリ 'name'を含む配列である場合は、arraです。 –

+0

@galador 'array_keys()'の使用はかなりクールですが、 'name'はトップレベルではなくサブアレイにあります。 – Orbling

2

implodeソリューションは最もシンプルですが、ループを要求しました。このメソッドは、ループ内に余分な条件を追加することを避けるため、やや効率的です。基本的には、最後のアイテムとは異なる何かをする代わりに、最初のアイテムとは異なることをします。

$myArray = array(); //Fill with whatever 
$result = $myArray[0]; 
for ($idx = 1; $idx < count($myArray); $idx += 1) 
{ 
    $result .= ', ' . $myArray[$idx]; 
} 

EDIT:実現したらだけではなく、$項目の$項目[「名前」]をしたい:

$myArray = array(); //Fill with whatever 
$result = $myArray[0]['name']; 
for ($idx = 1; $idx < count($myArray); $idx += 1) 
{ 
    $result .= ', ' . $myArray[$idx]['name']; 
} 
+0

おっと、for($ idx = 1; $ idx Jonah

+1

@Jonah:ありがとう:) –

4

はすぐにエコーが、あなたはトリミングすることができ、変数にあなたの出力を保存しないでください。

<?php 
if ($category) { 
    $output = ''; 
    foreach($category as $item) { 
      $output .= $item['name']; 
      $output .= ", "; 
    } 
    echo rtrim($output, ', '); 
} 
?> 
+0

'rtrim()'を使って、 'preg_replace()'と 'substr()'メソッドよりも明瞭です。 – Orbling

+0

実際にはsubstr()は何も知る必要がないため、はるかに高速です。それはそれが与えられていることを知っていなければなりません(文字列と2つの数字)。 rtrim()は検索する必要があります。 preg_replaceはちょうど狂っています – Rudie

+0

@ルーディー:私は決して言わなかった*高速*、私は言った*明確な*、マイクロソフトの操作がかかる場合は、コードで最も重要です。 – Orbling

0

そして、別のオプション:

<?php 
$out = ""; 

foreach ($category as $item) 
    { 
    $out .= $item['name']. ", "; 
    } 

$out = preg_replace("/(.*), $/", "$1", $out); 
echo $out; 
?> 
+0

'preg_replace'は本当に' substr($ out、0、-2) 'よりずっと簡単でしたか? –

+0

おっと、 '$ out = preg_replace(" /(.*)、/ "、 '$ 1'、$ out);'にする必要があります。とにかく他の解はもっと効率的だと思われますが... substrはおそらく正規表現より優れています。 – Jonah

+1

@Billy ONeal:ええ、私は 'substr'のパラメータを覚えていないからです:)とにかく、両者の間に大きな違いがあるインスタンスを見つけるのは本当にまれです。 – nico

1

「最後のコンマ」問題への標準液は、配列にアイテムを入れて、それを内破することです:

$temp = array(); 
foreach($category as $item) 
    $temp[] = $item['name']; 
echo implode(', ', $temp); 

したい場合これはより一般的ですが、各サブアレイから特定のフィールドを選択( "抜き出す")する関数を書くこともできます:

function array_pluck($ary, $key) { 
    $r = array(); 
    foreach($ary as $item) 
     $r[] = $item[$key]; 
    return $r; 
    } 

してからちょうど

echo implode(', ', array_pluck($category, 'name')); 
+0

これは私の答えにコメントでPHPで必要とされているように私が記述していた関数の良い名前です。それで、なぜ私は地図を使うのですか?しかし、良い。 +1 – Orbling

0

それとも、最後のキーをチェックすることもできます

 
end($category); 
$lastkey = key($category); 
foreach ($category AS $key => $item) { 
    echo $item['name']; 
    if ($lastkey != $key) { 
    echo ', '; 
    } 
} 
関連する問題