2009-12-03 20 views
6

Đây có lẽ là một câu hỏi đơn giản, nhưng làm thế nào để bạn lặp qua một mảng, làm một cái gì đó cho mỗi cái, cho đến cái cuối cùng và làm điều gì đó khác?Làm thế nào để sử dụng vòng lặp foreach, nhưng làm điều gì đó khác biệt trong lần lặp lại cuối cùng?

Tôi có một loạt tên. Tôi muốn xuất danh sách các tên được phân tách bằng dấu phẩy.

Joe, Bob, Foobar

Tôi không muốn có một dấu phẩy ở cuối tên cuối cùng trong mảng, và cũng không nếu chỉ có một giá trị trong mảng (hoặc không có!) .

Cập nhật: Tôi không thể sử dụng implode() vì tôi có một mảng đối tượng Mô hình người dùng, nơi tôi lấy tên từ từng đối tượng.

$users = array(); 
$users[] = new User(); 

foreach ($users as $user) { 
    echo $user->name; 
    echo ', '; 
} 

Làm thế nào tôi có thể đạt được điều này và vẫn sử dụng các đối tượng này?

Cập nhật: Tôi lo lắng quá nhiều về số lượng mã tôi đã đặt trong tập lệnh xem của mình, vì vậy, tôi quyết định tạo trình trợ giúp chế độ xem. Đây là những gì tôi đã kết thúc với:

$array = array(); 
foreach($users as $user) { 
    $array[] = $user->name; 
} 
$names = implode(', ', $array); 
+0

@Andrew, tôi đã cập nhật câu hỏi của mình với câu trả lời cho bản cập nhật của bạn. –

Trả lời

15

Sử dụng implode:

$names = array('Joe', 'Bob', 'Foobar'); 
echo implode(', ', $names); # prints: Joe, Bob, Foobar 

Để làm rõ, nếu chỉ có một đối tượng trong mảng, các ', ' tách sẽ không được sử dụng ở tất cả, và một chuỗi có chứa các mục duy nhất sẽ được trả lại.

EDIT: Nếu bạn có một mảng của các đối tượng, và bạn muốn làm điều đó theo một cách khác hơn là một vòng lặp for với các bài kiểm tra, bạn có thể làm điều này:

function get_name($u){ return $u->name; }; 
echo implode(', ', array_map('get_name', $users)); # prints: Joe, Bob, Foobar 
+0

cảm ơn cho câu trả lời của bạn, tiếc là tôi không thể sử dụng implode() vì mảng chứa các đối tượng. Có cách nào khác để tôi có thể đạt được điều tương tự không? – Andrew

+2

Trong PHP 5.3+ bạn thậm chí không cần khai báo hàm, chỉ cần thực hiện ẩn danh: implode (',', array_map (hàm ($ user) {return $ user-> name;}, $ users) –

+0

xấu mà tôi đã viết php trong nhiều năm và không bao giờ nghĩ về điều này? –

6
$array = array('joe', 'bob', 'Foobar'); 
$comma_separated = join(",", $array); 

đầu ra:

joe,bob,Foobar

+0

dường như tham gia là một bí danh cho implode :) –

+0

Tôi thực sự thích việc sử dụng tham gia bởi vì nó không nhầm lẫn những người đến từ một nền java/perl. – karim79

+0

Tôi biết! Đáng buồn thay, 'split' không phải là bí danh cho' explode'. Vì vậy, trong PHP tôi chỉ sử dụng 'explode' và' implode' như là lame như tên là :) –

1

psuedocode ....

integer sigh=container.getsize(); 
sigh--; 
integer gosh=0; 
foreach element in container 
{ 
    if(gosh!=sigh) 
    dosomething(); 
    else 
    doLastElementStuff(); 
    gosh++; 
} 

xem xét tất cả các câu trả lời khác, có vẻ như PHP đã nhận được nhiều cú pháp hơn S kể từ lần cuối tôi viết bất cứ điều gì trong đó: D

+0

tôi sẽ cung cấp cho bạn một +1 để đọc tiêu đề, nhưng tôi sẽ phải cung cấp cho -1 cho không đọc câu hỏi :) –

+0

Các câu hỏi đã được chỉnh sửa trong khi tôi đã viết câu trả lời:/ –

+0

Ah, có ý nghĩa. Tôi phải vấp phải nó ngay sau khi chỉnh sửa. –

3

Đôi khi bạn có thể không muốn sử dụng implode. Bí quyết là sử dụng một biến phụ trợ để theo dõi không phải là biến cuối cùng, mà là lần đầu tiên qua vòng lặp. vis:

$names = array('Joe', 'Bob', 'Foobar'); 
$first = true; 
$result = ''; 
foreach ($names as $name) 
{ 
    if (!$first) 
     $result .= ', '; 
    else 
     $first = false; 

    $result .= $name; 
} 
+0

Điều đó đang rối tung với đầu tôi. –

0

cá nhân tôi thấy cách nhanh nhất (nếu bạn đang vào vi tối ưu hóa) là:

if(isset($names[1])) { 
    foreach ($names as $name) { 
     $result .= $name . ', '; 
    } 
    $result = substr($result, 0, -2); 
    } else { 
    $result = $names[0]; 
    } 

isset($names[1]) là cách nhanh nhất (mặc dù không quá rõ ràng) kiểm tra độ dài của một mảng (hoặc chuỗi). Trong trường hợp này, việc kiểm tra ít nhất hai phần tử được thực hiện.

+0

Bạn cần '-2' thay vì' -1' để xóa dấu cách __and__ dấu phẩy. –

+0

xin lỗi, cố định, mệt mỏi:] – raveren

1

tôi đi qua này một tòa nhà rất nhiều câu lệnh SQL, vv

$joiner = " "; 
foreach ($things as $thing) { 
    echo " $joiner $thing \n"; 
    $joiner = ','; 
} 

Đối với một số lý do của nó dễ dàng hơn để làm việc ra logic nếu bạn nghĩ đến "", 'VÀ' hoặc 'OR' như một tùy chọn/thuộc tính đi trước một mục. Vấn đề sau đó trở thành làm thế nào để ngăn chặn các "," trên dòng đầu tiên.

+0

Rất mát mẻ miễn là không gian màu trắng không phải là một vấn đề. Nhưng khái niệm là mạnh mẽ, và bạn có thể viết nó một cách khác nhau để loại bỏ khoảng trống thừa. +1 –

0

Tôi thực sự thấy dễ dàng hơn khi tạo văn bản được phân cách bằng dấu phẩy của mình hơi khác một chút. Nó hơi phức tạp hơn một chút, nhưng nó ít gọi hàm.

<?php 
$nameText = ""; 
for ($i = 0; $i < count($nameArray); $i++) { 
if ($i == 0) { 
$nameText = $nameArray[$i]; 
} 
else { 
$nameText .= "," . $nameArray[$i]; 
} 
} 

Nó thêm dấu phẩy làm tiền tố cho mỗi tên trừ khi đó là phần tử đầu tiên nếu mảng đó. Tôi đã thích sử dụng cho như trái ngược với foreach vì tôi có thể dễ dàng truy cập vào chỉ mục hiện tại và do đó các thành phần lân cận của một mảng. Bạn có thể sử dụng foreach như sau:

<?php 
$nameText = ""; 
$nameCounter = 0; 
for ($nameArray as $thisName) { 
if ($nameCounter == 0) { 
$nameText = $thisName; 
$nameCounter++; 
} 
else { 
$nameText .= "," . $thisName; 
} 
} 
+0

Nhưng 'đếm' lại đánh giá trên mỗi vòng lặp, do đó bạn vẫn có một cuộc gọi hàm trên mỗi vòng lặp. Ngoài ra, bạn cũng đang giới thiệu một câu lệnh 'if' trên mỗi vòng lặp. –

Các vấn đề liên quan