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 = "''";
науковцю

1
Чудове рішення mcgrailm ... дуже це оцінюю
Sandeep Garg

1
дякую @mcgrailm, він працює для моїх проектів. дуже ціную це.
Wafie Ali

Відповіді:


29

Ні, так, як ви це робите, це просто добре. implode()бере лише 1-2 параметри (якщо ви просто постачаєте масив, він з'єднує шматки порожнім рядком).


Здається, немає різниці в швидкості в жодному з цих рішень, я просто продовжую робити це так, як завжди, дякую за допомогу всім
mcgrailm

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


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

просто так швидко, як це стає
Джеффз

це робить роботу для мене
mikey

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));

DEMO

Також зауважте, що існує, fputcsvякщо ви хочете написати у файл.


@Felix Kling Я підозрюю, що це буде також повільніше?
mcgrailm

1
@mcgrailm, я знову запитую: повільніше, ніж що?
Naftali aka Neal

2
@mcgrailm: Можливо, я пропоную вам зробити орієнтир і дізнатися;)
Фелікс Клінг

@Felix Kling Як ​​це зробити?
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)."'";

і я міг би це зробити, але, якщо ввести визначення масиву там, де змінна $ масив знаходиться в останньому рядку, але я, швидкість
різниці

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
Naftali aka Neal

повільніше, ніж в даний момент я створюю свій 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
приєднання - це лише псевдонім implode
mcgrailm

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.