2010-08-18 24 views
6

Tôi đang cố gắng để 'đẹp-in' ra một mảng, sử dụng một cú pháp như sau:PHP - khi sử dụng foreach để lặp qua mảng, làm cách nào tôi có thể biết liệu tôi có đang sử dụng cặp cuối cùng không?

$outString = "["; 
foreach($arr as $key=>$value) { 
    // Do stuff with the key + value, putting the result in $outString. 
    $outString .= ", "; 
} 
$outString .= "]"; 

Tuy nhiên nhược điểm rõ ràng của phương pháp này là nó sẽ hiển thị một "" ở cuối của mảng in ra, trước khi đóng "]". Có cách nào tốt bằng cách sử dụng cú pháp $ key => $ value để phát hiện xem bạn đang ở trên cặp cuối cùng trong mảng hay tôi nên chuyển sang vòng lặp bằng cách sử dụng each() thay thế?

Trả lời

12

Xây dựng một mảng, và sau đó sử dụng implode:

$parts = array(); 
foreach($arr as $key=>$value) { 
    $parts[] = process($key, $value); 
} 

$outString = "[". implode(", ", $parts) . "]"; 
+0

Hàm 'process()' làm gì? –

+0

Bất cứ điều gì bạn muốn ... Xin lỗi, có lẽ nên đặt tên nó một cách hữu ích hơn - đó là bit cho OP điền vào. –

4

Bạn chỉ có thể cắt bỏ dấu "," cuối cùng khi chấm dứt bằng cách sử dụng chuỗi con.

$outString = "["; 
foreach($arr as $key=>$value) { 
    // Do stuff with the key + value, putting the result in $outString. 
    $outString .= ", "; 
} 

$outString = substr($outString,-2)."]"; //trim off last ", " 
4

Do việc xử lý riêng biệt và sau đó sử dụng implode() tham gia:

$outArr = array(); 
foreach($arr as $key => $value) { 
    $outArr[] = process($key, $value); 
} 
$outString = '[' . implode(', ', $outArr) . ']'; 
+0

bạn có thể giải thích câu trả lời này không? Hay đấy. – Chris

+0

@Chris Tôi đã bỏ qua việc xử lý bổ sung, nhưng bạn có thể sử dụng [implode()] (http://php.net/manual/en/function.implode.php) để tham gia các phần tử mảng. –

2

Nó có thể được dễ dàng hơn để làm điều đó như và thêm dấu phẩy vào chuỗi trước mục nếu nó không phải là mục đầu tiên.

$first= true; 
foreach ($arr as $key => $value) { 
    if (! $first) { 
     $outString .=', '; 
    } else { 
     $first = false; 
    } 

    //add stuff to $outString 
} 

Định dạng đầu ra có phải là JSON không? Nếu vậy bạn có thể cân nhắc sử dụng json_encode() để thay thế.

+0

mặc dù nó không phải là một vấn đề lớn, với tôi điều này chỉ thêm độ phức tạp cho hiệu quả của thuật toán khi nó không cần ở đó. – Chris

+1

Có, nhưng cách tiếp cận cũng tốt. Nó dễ dàng hơn để tìm thấy nếu chúng ta đang ở trên các yếu tố đầu tiên hơn cuối cùng. Thuật toán hữu ích có thể được sử dụng. – Savageman

1

Bạn có thể làm điều đó như một bình thường đối với vòng lặp:

$outString = "["; 
for ($i = 0; $i < count($arr); $i++) { 
    // Do stuff 
    if ($i != count($arr) - 1) { 
     $outString += ", "; 
    } 
} 

Tuy nhiên, cách đẹp nhất để làm điều đó, IMHO, được lưu trữ tất cả các thành phần trong một mảng, và sau đó nổ tung:

$outString = '[' . implode(', ', $arr) . ']'; 

implode() lấy tất cả các phần tử trong một mảng và đặt chúng lại với nhau trong một chuỗi, được phân tách bằng đối số đầu tiên của nó.

3

Bất kể trường hợp của ví dụ của bạn (tham gia chuỗi bằng dấu phẩy, trong đó implode là cách phù hợp), để trả lời câu hỏi cụ thể, cách kinh điển để lặp qua mảng và kiểm tra xem bạn có bật phần tử cuối cùng đang sử dụng CachingIterator:

<?php 
$array = array('k'=>'v', 'k1'=>'v1'); 

$iter = new CachingIterator(new ArrayIterator($array)); 
$out = ''; 
foreach ($iter as $key=>$value) { 
    $out .= $value; 

    // CachingIterator->hasNext() tells you if there is another 
    // value after the current one. 
    if ($iter->hasNext()) { 
     $out .= ', '; 
    } 
} 
echo $out; 
+0

Wow - Tôi chưa từng thấy tài liệu chưa hoàn chỉnh trên trang PHP trước đây - "Mô tả ở đây ..." ở mọi nơi! –

+0

Vâng, một số lĩnh vực của tài liệu chưa được khắc phục. Tôi đã làm việc với các công cụ DOMDocument gần đây và nó tương tự như chắp vá. Có tài liệu phụ trợ cho SPL [ở đây] (http://www.php.net/~helly/php/ext/spl/), nhưng nó không hữu ích hơn nhiều. – Shabbyrobe

1

Có nhiều khả năng. Tôi nghĩ rằng đây là một trong những giải pháp đơn giản nhất:

$arr = array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e', 5 => 'f', 6 => 'g'); 

echo '[', current($arr); 
while ($n = next($arr)) echo ',', $n; 
echo ']'; 

Đầu ra:

[a,b,c,d,e,f,g] 
1

tôi có xu hướng để tránh sử dụng các vòng lặp trong những tình huống như thế này. Bạn nên sử dụng implode() để nối các danh sách với một trình phân định chung và sử dụng array_map() để xử lý bất kỳ quá trình xử lý nào trên mảng đó trước khi kết nối. Lưu ý các triển khai sau đây cần thể hiện tính linh hoạt của các chức năng này. Bản đồ mảng có thể lấy một chuỗi (tên của một hàm) đại diện cho một hàm dựng sẵn hoặc hàm do người dùng định nghĩa (3 ví dụ đầu tiên). Bạn có thể truyền cho nó một hàm bằng hàm create_function() hoặc truyền hàm lambda/anonymous như tham số đầu tiên.

$a = array(1, 2, 3, 4, 5); 

// Using the user defined function 
function fn ($n) { return $n * $n; } 
printf('[%s]', implode(', ', array_map('fn', $a))); 
// Outputs: [1, 4, 9, 16, 25] 

// Using built in htmlentities (passing additional parameter 
printf('[%s]', implode(', ', array_map('intval' , $a))); 
// Outputs: [1, 2, 3, 4, 5] 

// Using built in htmlentities (passing additional parameter 
$b = array('"php"', '"&<>'); 
printf('[%s]', implode(', ', array_map('htmlentities' , $b, array_fill(0 , count($b) , ENT_QUOTES)))); 
// Outputs: [&quot;php&quot;, &quot;&amp;&lt;&gt;] 

// Using create_function <PHP 5 
printf('[%s]', implode(', ', array_map(create_function('$n', 'return $n + $n;'), $a))); 
// Outputs: [2, 4, 6, 8, 10] 

// Using a lambda function (PHP 5.3.0+) 
printf('[%s]', implode(', ', array_map(function($n) { return $n; }, $a))); 
// Outputs: [1, 2, 3, 4, 5] 
Các vấn đề liên quan