php implode (101) với dấu ngoặc kép


115

Mã hóa một mảng đơn giản

sẽ trông như thế này

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

và điều đó sẽ trả lại

 lastname,email,phone

tuyệt vời, vì vậy tôi có thể làm điều này thay thế

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

và bây giờ tôi có những gì tôi muốn có một chuỗi csv đẹp

 'lastname','email','phone'

có cách nào tốt hơn để làm điều này không, tôi cảm thấy như nên có một tham số tùy chọn cho việc ghép mã, tôi có thiếu thứ gì không?


11
Tôi thấy rất nhiều bình luận về việc các câu trả lời được cung cấp là "chậm hơn". Nó không quan trọng . Chọn cách rõ ràng hơn và dễ bảo trì hơn, hãy lo lắng về hiệu suất sau này, nếu có.
Mudgar

1
Hạn chế duy nhất là nó sẽ tạo ra một chuỗi trống nếu mảng trống. I E. tương đương với$comma_separated = "''";
scipilot

1
Lớn giải pháp mcgrailm ... thực sự đánh giá cao nó
Sandeep Garg

1
cảm ơn @mcgrailm, nó hoạt động cho các dự án của tôi. thực sự đánh giá cao điều này.
Wafie Ali

Câu trả lời:


29

Không, cách bạn đang làm là tốt. implode()chỉ nhận 1-2 tham số (nếu bạn chỉ cung cấp một mảng, nó sẽ nối các phần bằng một chuỗi rỗng).


nó dường như không có sự khác biệt tốc độ trong bất kỳ các giải pháp này tôi sẽ chỉ tiếp tục làm nó họ cách tôi luôn luôn có, nhờ sự giúp đỡ của mọi người
mcgrailm

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


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

đơn giản nhanh như nó được
Jeffz

Điều này thực hiện công việc cho tôi
mikey

5
Chú ý đến mảng trống khi sử dụng giải pháp này.
Luigi

Cảm ơn. Tôi đã sử dụng cái này cho<ul> <li> {!! implode('</li><li>', session('messages')) !!} </li> </ul>
marlo

42

Bạn có thể sử dụng array_map():

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

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

BẢN GIỚI THIỆU

Cũng lưu ý rằng có fputcsvnếu bạn muốn ghi vào một tệp.


@Felix Kling Tôi nghi ngờ điều này cũng sẽ chậm hơn?
mcgrailm

1
@mcgrailm, tôi hỏi lại: chậm hơn cái gì?
Naftali hay còn gọi là Neal,

2
@mcgrailm: Có thể, tôi khuyên bạn nên làm điểm chuẩn và tìm hiểu;)
Felix Kling

@Felix Kling làm cách nào để làm điều đó?
mcgrailm

1
Điều này có thêm lợi ích là cho phép bạn thoát khỏi bất kỳ dấu ngoặc kép đơn lẻ nào có thể xuất hiện trong các phần tử của mảng
urgar

29
$ids = sprintf("'%s'", implode("','", $ids ) );

Tuyệt vời, đơn giản và trực tiếp.
Vinícius

23

Không biết có nhanh hơn không, nhưng bạn có thể lưu một dòng mã bằng phương pháp của mình:

Từ

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

Đến:

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

và tôi có thể thêm rằng nhưng đặt định nghĩa của mảng trong nơi $ mảng biến là trong dòng cuối cùng nhưng tôi diff tốc độ sẽ rất hữu hạn
mcgrailm

8

Nếu bạn muốn sử dụng các vòng lặp, bạn cũng có thể làm:

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

Demo: http://codepad.org/O2kB4fRo


1
@mcgrailm, chậm hơn cái gì? Về cơ bản nó giống như một thứ array_mapnhưng không sử dụngarray_map
Naftali hay còn gọi là Neal,

chậm hơn so với cách tôi hiện tạo chuỗi csv của mình
mcgrailm

@mcgrailm xem bình luận của @ FelixKling
Naftali hay còn gọi là Neal,

1
+1 dường như là câu trả lời đúng duy nhất - tất cả các câu trả lời khác sẽ tạo ra chuỗi trống khi cố gắng nhập mảng trống. Điều này sẽ không.
Denis Matafonov

Cảm ơn @DenisMatafonov :-)
Naftali aka Neal

2

Ngoài ra, bạn có thể tạo một hàm như vậy:

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

1

Nếu bạn muốn tránh hệ thống con fopen / fputcsv, đây là đoạn mã xây dựng một chuỗi CSV thoát từ một mảng kết hợp ....

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

Hoặc từ danh sách các đối tượng ...

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

Sau đó, bạn có thể xuất chuỗi như mong muốn.


0

bạn cũng có thể làm theo cách này

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

2
tham gia chỉ là bí danh của implode
mcgrailm

0

Tôi nghĩ đây là những gì bạn đang cố gắng làm

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

0

Một tùy chọn khả thi khác, tùy thuộc vào những gì bạn cần mảng cho:

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

Điều này sẽ đặt '[' và ']' xung quanh chuỗi, bạn có thể muốn hoặc không muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.