php implode (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'

есть ли лучший способ сделать это, мне кажется, что должен быть необязательный параметр для взрыва, я что-то упускаю?

Mcgrailm
источник
11
Я вижу много комментариев о том, что предоставленные ответы «медленнее». Неважно . Выберите способ, который более понятен и удобен в обслуживании, беспокоитесь о производительности позже, если это вообще возможно.
meagar
1
Единственный недостаток - это будет одна пустая строка, если массив пуст. т.е. эквивалент$comma_separated = "''";
scipilot
1
Отличное решение, макгрейлм ... действительно ценю это
Сандип Гарг
1
спасибо @mcgrailm, он работает для моих проектов. очень ценю это.
Wafie Ali

Ответы:

29

Нет, то, как вы это делаете, в порядке. implode()принимает только 1-2 параметра (если вы просто предоставляете массив, он объединяет части пустой строкой).

Рэйф Кеттлер
источник
похоже, что нет разницы в скорости ни в одном из этих решений, я просто буду продолжать делать это так, как всегда, спасибо за помощь всем
mcgrailm
163
$array = array('lastname', 'email', 'phone');


echo "'" . implode("','", $array) . "'";
Умеш Могария
источник
просто настолько быстро, насколько возможно
Джеффз
это делает мою работу
Майки
5
Следите за пустым массивом при использовании этого решения.
Луиджи
Спасибо. Я использовал это для<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
1
@mcgrailm, еще раз спрашиваю: медленнее чем что?
Нафтали, он же Нил,
2
@mcgrailm: Может быть, я предлагаю вам сделать тест и выяснить;)
Феликс Клинг
@ Феликс Клинг, как мне это сделать?
mcgrailm
1
Это дает дополнительное преимущество, позволяя избегать одинарных кавычек, которые могут появляться в элементах массива
meagar
29
$ids = sprintf("'%s'", implode("','", $ids ) );
Робб
источник
Замечательно, просто и прямо.
Виниций
23

Не знаю, быстрее ли это, но вы можете сохранить строку кода своим методом:

Из

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

Кому:

$array = array('lastname', 'email', 'phone');
$comma_separated = "'".implode("','", $array)."'";
Дрю Делло Стритто
источник
и я мог бы продолжить это, но поместив определение массива туда, где переменная $ array находится в последней строке, но
разница
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
@mcgrailm см. комментарий @ FelixKling
Naftali aka Neal
1
+1 кажется единственным правильным ответом - все остальные ответы будут давать пустую строку при попытке взорвать пустой массив. Этот не будет.
Денис Матафонов
Спасибо @DenisMatafonov :-)
Naftali aka 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
0

Я думаю, это то, что ты пытаешься сделать

$array = array('lastname', 'email', 'phone');
echo "'" . implode("','", explode(',', $array)) . "'";
стойка_nilesh
источник
0

Другой возможный вариант, в зависимости от того, для чего вам нужен массив:

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

Это поместит "[" и "]" вокруг строки, что вы можете или не хотите.

Джереми Френч
источник