Jak utworzyć listę oddzieloną przecinkami z tablicy w PHP?

113

Wiem, jak przechodzić przez elementy tablicy przy użyciu foreach i dołączać przecinek, ale usunięcie ostatniego przecinka jest zawsze uciążliwe. Czy jest na to łatwy sposób w PHP?

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

Ostatecznie chcę

$result = "apple, banana, pear, grape"
st4ck0v3rfl0w
źródło

Odpowiedzi:

231

Chcesz do tego użyć implodu .

to znaczy: $commaList = implode(', ', $fruit);


Istnieje sposób na dołączanie przecinków bez końca. Chciałbyś to zrobić, jeśli musisz wykonać inne manipulacje w tym samym czasie. Na przykład, może chcesz zacytować każdy owoc, a następnie oddzielić je wszystkie przecinkami:

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

Ponadto, jeśli robisz to w „normalny” sposób dodawania przecinka po każdym elemencie (tak, jakbyś robił to wcześniej) i musisz przyciąć ostatni, po prostu zrób $list = rtrim($list, ', '). Widzę, że substrw tej sytuacji wielu ludzi niepotrzebnie się bawi .

ryeguy
źródło
4
Bardziej sensowne byłoby (gdybyśmy próbowali dodać cudzysłowy) wywołanie <code> $ fruitlist = '"'. Implode ('", "', $ fruit). '"'; </code>
cwallenpoole
Pętla foreach jest lepsza, jeśli chcesz manipulować danymi w tablicy przed przekształceniem jej w łańcuch; Na przykład addlashes lub mysql_real_escape_string.
Naphtali Gilead
39

Oto jak to robiłem:

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

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

echo $string;

Wynik:

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

Demo na żywo: http://ideone.com/EWK1XR

EDYCJA: Zgodnie z komentarzem @ joseantgv, powinno być możliwe usunięcie rtrim()z powyższego przykładu. To znaczy:

$string = implode(',', $arr);
Nate
źródło
5
Jak odpowiedział powyżej, możesz po prostu zrobić implode (',', $ arr)
joseantgv
@joseantgv Masz rację, nie wiem, dlaczego używam rtrim(). Pamiętam, że miałem problem z dodatkowymi przecinkami na końcu ciągu, ale nie pamiętam sytuacji, w której to się działo.
Nate,
6

Wynik z andna końcu:

$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
Waqar Alamgir
źródło
3

Podobny do odpowiedzi Lloyda, ale działa z tablicą o dowolnej wielkości.

$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."
        }
ceasetodream
źródło
3

Wolę używać instrukcji IF w pętli FOR, która sprawdza, czy bieżąca iteracja nie jest ostatnią wartością w tablicy. Jeśli nie, dodaj przecinek

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

for($i = 0; $i < count($fruit); $i++){
    echo "$fruit[$i]";
    if($i < (count($fruit) -1)){
      echo ", ";
    }
}
Lloyd Banks
źródło
2
jeśli całkowita liczba jest inna niż 4?
Jyothish,
1

Czasami nawet nie potrzebujesz do tego php w niektórych przypadkach (na przykład elementy listy są w swoim własnym ogólnym tagu podczas renderowania) Zawsze możesz dodać przecinki do wszystkich elementów oprócz ostatniego dziecka przez css, jeśli są one oddzielnymi elementami po wyrenderowaniu ze scenariusza.

Używam tego często w aplikacjach szkieletowych, aby przyciąć jakiś dowolny kod:

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

Zasadniczo patrzy na element, celuje we wszystko oprócz ostatniego elementu, a po każdym elemencie dodaje przecinek. To tylko alternatywny sposób, aby w ogóle nie używać skryptu, jeśli ma to zastosowanie.

Lux. Kondensator
źródło
1
$fruit = array('apple', 'banana', 'pear', 'grape');    
$commasaprated = implode(',' , $fruit);
Vijay Prajapati
źródło
0

Funkcjonalne rozwiązanie wyglądałoby tak:

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

array_reduce(
    $fruits,
    function($fruitsStr, $fruit) use ($sep) {
        return (('' == $fruitsStr) ? $fruit : $fruitsStr . $sep . $fruit);
    },
    ''
);
Danielside
źródło
0

Podążaj za tym

$teacher_id = '';

        for ($i = 0; $i < count($data['teacher_id']); $i++) {

            $teacher_id .= $data['teacher_id'][$i].',';

        }
        $teacher_id = rtrim($teacher_id, ',');
        echo $teacher_id; exit;
Wspaniały islam
źródło
-1

Jeśli robisz cytowane odpowiedzi, możesz to zrobić

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

powyższe zakłada, że ​​owoc nie jest zerowy. Jeśli nie chcesz robić tego założenia, możesz użyć instrukcji if-then-else lub operatora potrójnego (? :).

vogomatix
źródło
-2

Innym sposobem może być ten:

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

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

Wynik $resultjest ładnie sformatowaną listą oddzieloną przecinkami.

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

wyjście-> a, b, c, d, e, f, g

Sanjay Arora
źródło