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'

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


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


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)) . "'";

0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.