phpは引用符で分解します(101)


115

単純な配列の実装

このようになります

$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);

そしてそれはこれを返すでしょう

 lastname,email,phone

素晴らしいので、代わりにこれを行うかもしれません

$array = array('lastname', 'email', 'phone');
$comma_separated = implode("','", $array);
$comma_separated = "'".$comma_separated."'";

そして今、私は素敵なかなりのCSV文字列が欲しいものを持っています

 'lastname','email','phone'

これを行うためのより良い方法はありますか?それは、私が何かを見逃しているのではないかというオプションのパラメータがあるべきだと私に感じますか?


11
提供された回答が「遅い」というコメントがたくさんあります。それは問題ではありません。より明確で保守しやすい方法を選択し、パフォーマンスについては、もしあれば心配します。
貧弱

1
唯一の欠点は、配列が空の場合に空の文字列が1つ生成されることです。すなわち。に相当$comma_separated = "''";
scipilot 2014年

1
素晴らしいソリューションmcgrailm ...本当に感謝しています
Sandeep Garg

1
@mcgrailmに感謝します。私のプロジェクトで機能しています。本当に感謝しています。
Wafie Ali

回答:


29

いいえ、あなたのやり方は問題ありません。implode()1から2のパラメーターのみを受け取ります(配列を指定するだけの場合、空の文字列で断片を結合します)。


これらのソリューションのいずれにも速度の違いはないようです。皆さんの助けに感謝して、いつもの方法でそれを続けます
mcgrailm

163
$array = array('lastname', 'email', 'phone');


echo "'" . implode("','", $array) . "'";

できるだけ早く
ジェフ2013

これは私の仕事です
mikey

5
このソリューションを使用している間は、空の配列に注意してください。
Luigi

ありがとう。私はこれを使用しました<ul> <li> {!! implode('</li><li>', session('messages')) !!} </li> </ul>
marlo

42

あなたは使うことができますarray_map()

function add_quotes($str) {
    return sprintf("'%s'", $str);
}

$csv =  implode(',', array_map('add_quotes', $array));

デモ

またfputcsv、ファイルに書き込みたい場合もあることに注意してください。


@Felix Klingこれも遅いのではないかと思いますか?
mcgrailm 2011年

1
@mcgrailm、私はもう一度尋ねます:何より遅いですか?
Naftali別名Neal

2
@mcgrailm:たぶん、私はあなたがベンチマークを作成し、それを見つけることをお勧めします;)
Felix Kling

@Felix Klingどうすればいいですか?
mcgrailm 2011年

1
これには、配列要素に表示される可能性のある単一引用符をエスケープできるという追加の利点があります
貧弱


23

より速いかどうかはわかりませんが、メソッドを使用してコード行を保存できます。

から

$array = array('lastname', 'email', 'phone');
$comma_separated = implode("','", $array);
$comma_separated = "'".$comma_separated."'";

に:

$array = array('lastname', 'email', 'phone');
$comma_separated = "'".implode("','", $array)."'";

そして私はそれをさらに進めることができますが、変数の$ arrayが最後の行にある場所に配列の定義を入れますが、速度差は非常に有限です
mcgrailm

8

ループを使用したい場合は、次のようにすることもできます。

$array = array('lastname', 'email', 'phone');
foreach($array as &$value){
   $value = "'$value'";
}
$comma_separated = implode(",", $array);

デモ:http : //codepad.org/O2kB4fRo


1
@mcgrailm、何より遅い?基本的には同じですが、array_map使用しませんarray_map
ナフタリ別名ニール

私が現在csv文字列を作成している方法よりも遅い
mcgrailm '23年

@mcgrailm @FelixKlingのコメントを参照
Naftali aka Neal

1
+1が唯一の正しい答えのようです。空の配列を爆破しようとすると、他のすべての答えは空の文字列を生成します。これはいけません。
Denis Matafonov 2017

ありがとう@DenisMatafonov :-)
Naftali別名Neal

2

または、そのような関数を作成できます。

function implode_with_quotes(array $data)
{
    return sprintf("'%s'", implode("', '", $data));
}

1

fopen / fputcsvサブシステムを回避したい場合は、連想配列からエスケープされたCSV文字列を作成するスニペットを次に示します。

$output = '';
foreach ($list as $row) {
  $output .= '"' . implode('", "', array_values($row)) . '"' . "\r\n";
}

またはオブジェクトのリストから...

foreach ($list as $obj) {
  $output .= '"' . implode('", "', array_values((array) $obj)) . '"' . "\r\n";
}

次に、必要に応じて文字列を出力できます。


0

あなたもこの方法でそれを行うことができます

<?php
$csv= '\'' . join(array('lastname', 'email', 'phone'),'\',').'\'';
echo $csv;
?>

2
joinは単なるimplodeのエイリアスです
mcgrailm '23年

0

これはあなたがやろうとしていることだと思います

$array = array('lastname', 'email', 'phone');
echo "'" . implode("','", explode(',', $array)) . "'";

0

配列が必要なものに応じて、別の可能なオプション:

$array = array('lastname', 'email', 'phone');
echo json_encode($array);

これにより、文字列が '['と ']'で囲まれます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.