2017-08-20 5 views
-1

私は多次元配列を持っており、カンマ区切りを入れて、これまでに各配列から最後のカンマを削除しようとしています。foreachの各配列から最後のコンマを削除するには?

$cars=array("Volvo","BMW","Toyota","Honda","Mercedes"); 
$chunks =(array_chunk($cars,2)); 
foreach ($chunks as $key) { 
    echo "<ul>"; 
    $data = array(); 
    foreach ($key as $value) { 
     $data[] ="<li>".$value."</li>".","; 
    } 
    rtrim($data, ","); 
    echo "</ul>"; 
} 
foreach ($data as $key) { 
    echo $key; 
} 

予想される出力:BMWHonda、またはMercedes後にコンマがないこと

<ul> 
    <li>Volvo,</li><li>BMW</li> 
</ul> 
<ul> 
    <li>Toyota,</li><li>Honda</li> 
</ul> 
<ul> 
    <li>Mercedes</li> 
</ul> 

注意してください。

+0

これはちょっと混乱しているようです。あなたは最終的に何を達成しようとしていますか?よりクリーンでシンプルな方法があるかもしれません。 –

+0

私は配列をチャンクし、各レコードに対してコンマを追加したいので最後の配列を削除して配列がこの配列( "Adrain" "Jonh"、 "Ferguson")のように見えるようにします –

+0

あなたのコードが何をするのか理解しています(そして、それは動作しません、 'rtrim()'を配列に使用しようとしています)、あなたが何をしようとしているのか分かりません。例えば、配列array –

答えて

1

array_chunk()の代わりにarray_splice()を使用するあまり知られていない方法です。いいえcount()呼び出し、増分カウンターなし、ただ1つのループ。

コード:(Demo

$cars=array("Volvo","BMW","Toyota","Honda","Mercedes"); 
while($cars){        // while there are still elements in the array... 
    $chunk=array_splice($cars,0,2);  // extract first two elements (reducing $cars) 
    if(isset($chunk[1])){$chunk[0].=',';} // add comma to 1st element if 2nd element exists 
    $output[]=$chunk;      // add extracted elements to multi-dim output 
} 
var_export($output); 

出力:

array (
    0 => 
    array (
    0 => 'Volvo,', 
    1 => 'BMW', 
), 
    1 => 
    array (
    0 => 'Toyota,', 
    1 => 'Honda', 
), 
    2 => 
    array (
    0 => 'Mercedes', 
), 
) 

あなたの順序なしリストの実装がさらに簡単です - ちょうどに参加した文字列</li><li>にカンマを追加implode()コール:,</li><li>。これはまた、より大きな「チャンク」でコードの汎用性を向上させました。 (私の最初のコードは2つの要素だけをサブアレイに適しているのに対し。)

コード:(Demo

$cars=array("Volvo","BMW","Toyota","Honda","Mercedes"); 
while($cars){ 
    $chunk=array_splice($cars,0,2); 
    echo "<ul><li>",implode(",</li><li>",$chunk),"</li></ul>"; // add comma to implode's glue string 
} 

出力:

<ul> 
    <li>Volvo,</li><li>BMW</li> 
</ul> 
<ul> 
    <li>Toyota,</li><li>Honda</li> 
</ul> 
<ul> 
    <li>Mercedes</li> 
</ul> 
+0

私はすべての人に感謝して、ここで理解できる質問をするのは難しいです。 –

+0

ここで 'array_splice'を使用するのはきれいですが、配列自身に変異を起こすため、いくつかの望ましくない副作用を与えることがあります。それはかなり遠いものですが、この 'ul'の後のどこかに車の総数を表示したいとします。 – sevavietl

+0

はい、 'array_splice()'は元の配列を変更しますが、何らかの理由でこれが問題になる場合は修正が簡単です。ループを走らせる前にトータルカーを計算することができます(ドラマはありません)。配列のクローンを保持するには、$ car = $ tmp = array( "Volvo"、 "BMW"、 "Toyota"、 "Honda"、 "Mercedes"); '$ tmp'を 'while'に変更します。それは...これがまったく問題であれば。 – mickmackusa

1

あなたが提供してきました、そして、あなたが探していると述べた結果は、以下によって生成されるべきサンプルコードに基づいて:

$cars = array("Volvo","BMW","Toyota","Honda","Mercedes"); 
$chunks = array_chunk($cars, 2); 

for ($i = 0; $i < count($chunks); ++$i) { 
    for ($j = 0; $j + 1 < count($chunks[ $i ]); ++$j) { 
     $chunks[ $i ][ $j ] .= ','; 
    } 
} 

$chunksはあなたが望んでいたと述べた多次元配列が含まれていますあなたのコメントには、非最後の要素ごとのコメントとともに。

+0

私はコンマが必要で最後のものを取り除くと言っています –

+0

あなたが言ったのは、あなたが '' array( "array(" Mercedes "))、array(" Toyota "、" Honda " 「ボルボ」、「BMW」)、アレイ(「トヨタ」、「ホンダ」)、アレイ(「ボルボ」、「BMW」、「トヨタ」、「ホンダ」、「メルセデス」) ( "Merced es"));それは上記のコードの機能です。どのカンマを削除したいですか? –

+0

doあなたはそれを見ますか?$ chunks =(array_chunk($ cars、2));私はあなたに3回お話しました。 –

0

あなたは、あなたがあなたのビューファイルでこれを行うと仮定すると、

$cars=array("Volvo","BMW","Toyota","Honda","Mercedes"); 

foreach (array_chunk($cars,2) as $chunk) { 
    echo '<ul>', PHP_EOL; 

    $keys = array_keys($chunk); 
    $lastKey = array_pop($keys); 
    foreach ($chunk as $key => $car) { 
     echo ' ', '<li>', $car, $key !== $lastKey ? ',' : '', '</li>', PHP_EOL; 
    } 

    echo '<ul>', PHP_EOL; 
} 

ですから、基本的にはeacの最後のキーを見つけることができますh chunkを処理する前に、カンマを追加するかどうかを判断することができます。注意を払うと、PHP_EOL' 'のようなものはフォーマットのためだけに追加されたので、削除する必要があります。

ここはworking demoです。

このアプローチはビュー内ではうまくいますが、他の方法ではデータを最初にフォーマットして表示する方がよい(つまり、データを走査中にエコーしないでください)。幾分機能的な例は次のようになります:

$cars=array("Volvo","BMW","Toyota","Honda","Mercedes"); 

$result = implode('', array_map(function ($items) { 
    $list = implode(',</li><li>', $items); 

    return "<ul><li>$list</li></ul>"; 
}, array_chunk($cars,2))); 

echo $result; 
関連する問題