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
ฉันเห็นความคิดเห็นมากมายเกี่ยวกับคำตอบที่ให้ไว้ว่า "ช้ากว่า" ชั่งหัวมัน เลือกวิธีที่ชัดเจนและดูแลรักษาได้มากกว่าไม่ต้องกังวลเรื่องประสิทธิภาพในภายหลังหากเป็นเช่นนั้น
meagar

1
ข้อเสียเปรียบเพียงอย่างเดียวคือมันจะสร้างสตริงว่างหนึ่งสตริงหากอาร์เรย์ว่างเปล่า กล่าวคือ เทียบเท่ากับ$comma_separated = "''";
scipilot

1
mcgrailm ทางออกที่ยอดเยี่ยม ... ขอบคุณจริงๆ
Sandeep Garg

1
ขอบคุณ @mcgrailm มันใช้งานได้สำหรับโครงการของฉัน ขอบคุณจริงๆ
Wafie Ali

คำตอบ:


29

ไม่วิธีที่คุณทำมันก็ใช้ได้ implode()ใช้เวลาเพียง 1-2 พารามิเตอร์ (ถ้าคุณใส่อาร์เรย์มันจะรวมชิ้นส่วนด้วยสตริงว่างเปล่า)


ดูเหมือนว่าจะไม่มีความแตกต่างด้านความเร็วในโซลูชันใด ๆ เหล่านี้ฉันจะทำต่อไปอย่างที่ฉันมีเสมอขอบคุณสำหรับความช่วยเหลือจากทุกคน
mcgrailm

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


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

ง่ายอย่างที่คิด
Jeffz

งานนี้สำหรับฉัน
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

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

และฉันสามารถทำได้มากกว่านั้น แต่การใส่คำจำกัดความของอาร์เรย์ในที่ที่ตัวแปร $ 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
Naftali aka Neal

ช้ากว่าวิธีที่ฉันสร้างสตริง csv ในปัจจุบัน
mcgrailm

@mcgrailm ดูความคิดเห็นของ @ FelixKling
Naftali aka Neal

1
+1 ดูเหมือนเป็นคำตอบเดียวที่ถูกต้อง - คำตอบอื่น ๆ ทั้งหมดจะสร้างสตริงว่างเมื่อพยายามระเบิดอาร์เรย์ว่าง อันนี้เคยชิน
Denis Matafonov

ขอบคุณ @DenisMatafonov :-)
Naftali aka Neal

2

หรือคุณสามารถสร้างฟังก์ชันดังกล่าว:

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

1

หากคุณต้องการหลีกเลี่ยงระบบย่อย fopen / fputcsv นี่คือตัวอย่างข้อมูลที่สร้างสตริง CSV ที่ใช้ Escape จากอาร์เรย์ที่เชื่อมโยง ...

$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 เป็นเพียงนามแฝงของการระเบิด
mcgrailm

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.