ฉันจะสร้างรายการที่คั่นด้วยจุลภาคจากอาร์เรย์ใน PHP ได้อย่างไร


114

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

$fruit = array('apple', 'banana', 'pear', 'grape');

ในที่สุดฉันก็ต้องการ

$result = "apple, banana, pear, grape"

คำตอบ:


232

คุณต้องการใช้การระเบิดสำหรับสิ่งนี้

กล่าวคือ: $commaList = implode(', ', $fruit);


มีวิธีการต่อท้ายเครื่องหมายจุลภาคโดยไม่ต้องต่อท้าย คุณต้องการทำสิ่งนี้หากคุณต้องทำการจัดการอื่น ๆ ในเวลาเดียวกัน ตัวอย่างเช่นคุณอาจต้องการอ้างถึงผลไม้แต่ละชนิดแล้วคั่นด้วยลูกน้ำ:

$prefix = $fruitList = '';
foreach ($fruits as $fruit)
{
    $fruitList .= $prefix . '"' . $fruit . '"';
    $prefix = ', ';
}

นอกจากนี้ถ้าคุณทำมันด้วยวิธี "ปกติ" ของท้ายจุลภาคหลังจากแต่ละรายการ (เช่นมันเสียงที่คุณกำลังทำก่อน) $list = rtrim($list, ', ')และคุณจำเป็นต้องตัดคนสุดท้ายที่ออกเพียงแค่ทำ ฉันเห็นผู้คนมากมายเข้ามายุ่งกับsubstrสถานการณ์นี้โดยไม่จำเป็น


4
มันจะสมเหตุสมผลกว่า (ถ้าพยายามใส่เครื่องหมายคำพูด) ให้เรียก <code> $ fruitlist = '"'. imode ('", "', $ fruit). '"'; </code>
cwallenpoole

foreach loop จะดีกว่าถ้าคุณต้องการจัดการข้อมูลนั้นในอาร์เรย์ก่อนที่จะทำให้เป็นสตริง ตัวอย่างเช่น addlashes หรือ mysql_real_escape_string
Naphtali Gilead

39

นี่คือวิธีที่ฉันทำ:

$arr = array(1,2,3,4,5,6,7,8,9);

$string = rtrim(implode(',', $arr), ',');

echo $string;

เอาท์พุต:

1,2,3,4,5,6,7,8,9

การสาธิตสด: http://ideone.com/EWK1XR

แก้ไข:ตามความคิดเห็นของ @ joseantgv คุณควรจะลบออกrtrim()จากตัวอย่างด้านบนได้ ได้แก่ :

$string = implode(',', $arr);

5
ตามที่ได้ตอบไว้ข้างต้นคุณสามารถทำการระเบิด (',', $ arr)
joseantgv

@joseantgv rtrim()คุณขวาผมไม่ทราบว่าทำไมผมใช้ ฉันจำได้ว่ามีปัญหากับการมีเครื่องหมายจุลภาคพิเศษที่ส่วนท้ายของสตริง แต่จำสถานการณ์ที่เกิดขึ้นไม่ได้
เนท

6

ผลลัพธ์andในตอนท้าย:

$titleString = array('apple', 'banana', 'pear', 'grape');
$totalTitles = count($titleString);
if ($totalTitles>1) {
    $titleString = implode(', ', array_slice($titleString, 0, $totalTitles-1)) . ' and ' . end($titleString);
} else {
    $titleString = implode(', ', $titleString);
}

echo $titleString; // apple, banana, pear and grape

3

คล้ายกับคำตอบของ Lloyd แต่ใช้ได้กับอาร์เรย์ทุกขนาด

$missing = array();
$missing[] = 'name';
$missing[] = 'zipcode';
$missing[] = 'phone';

if( is_array($missing) && count($missing) > 0 )
        {
            $result = '';
            $total = count($missing) - 1;
            for($i = 0; $i <= $total; $i++)
            { 
              if($i == $total && $total > 0)
                   $result .= "and ";

              $result .= $missing[$i];

              if($i < $total)
                $result .= ", ";
            }

            echo 'You need to provide your '.$result.'.';
            // Echos "You need to provide your name, zipcode, and phone."
        }

3

ฉันชอบใช้คำสั่ง IF ในลูป FOR ที่ตรวจสอบเพื่อให้แน่ใจว่าการวนซ้ำปัจจุบันไม่ใช่ค่าสุดท้ายในอาร์เรย์ ถ้าไม่มีให้เพิ่มลูกน้ำ

$fruit = array("apple", "banana", "pear", "grape");

for($i = 0; $i < count($fruit); $i++){
    echo "$fruit[$i]";
    if($i < (count($fruit) -1)){
      echo ", ";
    }
}

2
ถ้าจำนวนรวมต่างกันแค่ 4?
Jyothish

1

บางครั้งคุณไม่จำเป็นต้องใช้ php สำหรับสิ่งนี้ในบางกรณี (รายการแต่ละรายการอยู่ในแท็กทั่วไปของตัวเองในการเรนเดอร์เป็นต้น) คุณสามารถเพิ่มจุลภาคให้กับองค์ประกอบทั้งหมดได้ตลอดเวลา แต่ลูกสุดท้ายผ่าน css หากเป็นองค์ประกอบที่แยกจากกันหลังจากแสดงผล จากสคริปต์

ฉันใช้สิ่งนี้เป็นจำนวนมากในแอพกระดูกสันหลังเพื่อตัดไขมันรหัสโดยพลการ:

.likers a:not(:last-child):after { content: ","; }

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



0

โซลูชันที่ใช้งานได้จะเป็นดังนี้:

$fruit = array('apple', 'banana', 'pear', 'grape');
$sep = ','; 

array_reduce(
    $fruits,
    function($fruitsStr, $fruit) use ($sep) {
        return (('' == $fruitsStr) ? $fruit : $fruitsStr . $sep . $fruit);
    },
    ''
);


-1

หากทำคำตอบที่ยกมาคุณสามารถทำได้

$commaList = '"'.implode( '" , " ', $fruit). '"';

ข้างต้นถือว่าผลไม้ไม่เป็นโมฆะ หากคุณไม่ต้องการตั้งสมมติฐานนั้นคุณสามารถใช้คำสั่ง if-then-else หรือตัวดำเนินการ ternary (? :)


-2

อีกวิธีหนึ่งอาจเป็นเช่นนี้:

$letters = array("a", "b", "c", "d", "e", "f", "g");

$result = substr(implode(", ", $letters), 0, -3);

ผลลัพธ์ของ$resultคือรายการที่คั่นด้วยเครื่องหมายจุลภาคที่มีรูปแบบสวยงาม

a, b, c, d, e, f, g

-2
$letters = array("a", "b", "c", "d", "e", "f", "g"); // this array can n no. of values
$result = substr(implode(", ", $letters), 0);
echo $result

เอาท์พุท -> a, b, c, d, e, f, g

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.