2010-12-19 11 views
4

Iループを動作していない内破、foreachの()ループの最後のエントリを見つける:記事名を印刷するには、私のアレイを介し

<?php 
if ($articles) { 
    foreach($articles as $article) { 
     echo $article->name.", ";  
    } // end foreach article 
} // end if has articles 
?> 

これは明らかに

Apple, Banana, Mango, 

のようなものが生成されます。しかし、私は探しています以下のために:

Apple, Banana, Mango 

私はこのようないくつかの破文を試してみました

<?php 
if ($articles) { 
    foreach($articles as $article) { 
     echo implode(", ", $article->name);  
    } // end foreach article 
} // end if has articles 
?> 

または

<?php 
if ($articles) { 
    echo implode(", ", $articles->article->name);  
} // end if has articles 
?> 

これらのどれも私のために働いていません。どのようにそれを正しくすることができますか?ヒントありがとう!

+0

あなたは2つの選択肢があります:1.不要な場合はOOP構文を使用しないでください。配列が必要な場所でarrayを使い、implode()を利用します。 2.最後のエントリを見つけます。十数の方法があります。少なくとも1つを探してみてください。 –

答えて

6

foreachを使用して記事名を配列に追加し、次にimplode()という名前の配列を使用できます。

<?php 
if ($articles) { 
    $article_names = array(); 

    foreach($articles as $article) { 
     $article_names[] = $article->name; 
    } // end foreach article 

    echo implode(', ', $article_names); 
} // end if has articles 
?> 
+0

それは醜く見えます。 2つのループ。必要なのは1つだけです。 –

+0

@Colループは1つしか見ることができません。 – seriousdev

+0

ええ、それは魅力のように働いた。ありがとうございました! – caratage

6

それは、あなたの最初のループ反復をチェックするためにはるかに簡単です、あなたのテキストの前wrteコンマと最初の繰り返しでaoutでこのカンマを残す:

<?php 
if ($articles) { 
    $firstiteration = true: 
    foreach($articles as $article) { 
     if(!$firstiteration){ 
      echo ", "; 
     } 
     $firstiteration = false; 
     echo $article->name;  
    } // end foreach article 
} // end if has articles 
?> 

別の(私のoptionionでより美しく)可能性が_toSting()をオーバーライドすることです - あなたの記事 - クラスのメソッドを:

... 
function __toString(){ 
    return $this->name; 
} 
... 

と単にecho implode(", ",$articles)

+0

+1最初のコードスニペットに小さなエラーがありますが、 'echo $ article-> name。 '、"; 'は' echo $ article-> name; '... – wimvds

+0

他の小さなエラー - firstIterationをfalseに設定する必要がありますifブロックの外側で起こるか、決して実行されません –

+0

ヒントのおかげで、私はそれを修正しました – oezi

3

は、それはあなたが欲しいものを行うには良い方法です:

<?php 
$string = ''; 
if ($articles) { 
    foreach($articles as $article) { 
     $string .= $article->name.", ";  
    } 
} 
$string = substr($string, 0, -2); 
echo $string; 
?> 
+0

より良いかどうかはいいですが、かなり良いです –

0

PHPが良いのアレイ機能をたくさん持っている、これはそれらのいずれかの悲鳴。

$namesArray = array_map(function($x){return $x->name;}, $articles); 
$string = implode(',' $namesArray); 

OR

$first = true; 
array_walk(function($x) use (&$first) 
      { 
       if(!$first) {echo ', ';} else{$first = false;} 
       echo $x->name; 
      }, $articles); 

I本当に__toString機能付き上記の応答のようにも、私は彼らはしばしば賛成や不要なforeach文で利用不足していると思うので、私はこれらの配列関数を見せたかったです。

+0

+1の表示のためにarray_map - 私はこの場合toString/implode-combinationまたはforeach-loopを好みますが、誰もがこれらの配列関数を知っていなければなりません) – oezi

+0

@oezi array_mapは配列で動作します。 OPの問題であった爆縮と同様に。 –

+0

ジョンええ。 PHPには、コードを書き込み専用にする多くの方法があります。 –

0

トリム機能を使用すると、最後のコンマとスペースを削除できます。それは最も簡単な方法です。

<?php 
    if ($articles) { 
     foreach($articles as $article) { 
      echo trim(implode(", ", $article->name), ', '); 
     } 
    } 
?> 
関連する問題