2010-08-18 4 views
6

나는 구문처럼 사용하여 배열에서 '꽤 인쇄'를 시도하고있다 :이 방법의 명백한 단점이 배열의 끝에 ","보여줄 것입니다 그러나PHP - foreach를 사용하여 배열을 반복 할 때 마지막 페어에 있는지 어떻게 알 수 있습니까?

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

을 닫는 "]"전에 인쇄하십시오. $ key => $ 값 구문을 사용하여 배열의 마지막 쌍에 있는지 확인하거나, 대신 each()을 사용하여 루프로 전환해야합니까?

답변

12

배열을 구축하고 사용 implode :

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

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

'process()'함수는 무엇을 하는가? –

+0

당신이 원한다 무엇 이건 ... 미안 해요, 아마도 더 유용하게 이름을 붙여야합니다. 그건 OP 작성을위한 비트입니다. –

4

부분 문자열을 사용하여 종료 할 때 마지막 ","을 제거 할 수 있습니다.

$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

별도로 처리를 수행 한 후 가입 implode()를 사용

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

이 답변을 설명해 주시겠습니까? 이건 재미 있네. – Chris

+0

@Chris 여분의 처리는 생략했지만 [implode()] (http://php.net/manual/en/function.implode.php)를 사용하여 배열 요소를 결합 할 수 있습니다. –

2

처럼 할 쉬울 수 있습니다 첫 번째 항목이 아닌 경우 항목 앞의 문자열에 쉼표를 추가하십시오.

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

    //add stuff to $outString 
} 

출력 형식 JSON입니까? 그렇다면 json_encode()을 대신 사용해보십시오.

+0

큰 문제는 아니지만, 이것이 나에게 필요하지 않을 때 알고리즘의 효율성을 복잡하게 만듭니다. 거기에있다. – Chris

+1

네,하지만 접근법이 좋습니다. 우리가 마지막 요소보다 첫 번째 요소에 있다면 쉽게 찾을 수 있습니다. 사용할 수있는 유용한 알고리즘. – Savageman

1

당신은 루프의 정상으로 그것을 할 수 : 그러나

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

, 그것을 할 수있는 가장 좋은 방법은, 이럴 내파 다음 배열의 모든 구성 요소를 저장하고 :

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

implode()는 배열의 모든 요소를 ​​가져 와서 첫 번째 인수로 구분 된 문자열로 묶습니다.

3

예를 들어 (문자열을 쉼표로 결합하면 implode이 올바른 방법입니다) 특정 질문에 답하기 위해 배열을 반복하고 사용 중인지 확인하는 표준 방법 마지막 요소는 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

와우 - 전 PHP 사이트에서 불완전한 문서를 본적이 없습니다 - "설명은 여기에 ..."! –

+0

그래, 문서의 일부 영역이 훼손되지 않았습니다. 나는 최근에 DOMDocument와 함께 작업 해 왔으며 비슷하게 찌그러졌다. SPL [http://www.php.net/~helly/php/ext/spl/]에 대한 보조 문서가 있지만 그다지 도움이되지는 않습니다. – Shabbyrobe

1

많은 가능성이 있습니다. 나는 이것이 가장 간단한 솔루션 중 하나라고 생각합니다 :

$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 ']'; 

출력을 :

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

나는 이와 같은 상황에서 루프를 사용하지 않는 경향이있다. implode()를 사용하여 목록을 일반적인 구분 기호로 결합하고 array_map()을 사용하여 조인 전에 해당 배열의 모든 처리를 처리해야합니다. 이러한 기능의 다양성을 표현해야하는 다음 구현에 주목하십시오. 배열 맵은 내장 함수 나 사용자 정의 함수를 나타내는 문자열 (함수 이름)을 취할 수 있습니다 (처음 세 가지 예). create_function()을 사용하여 함수에 전달하거나 람다/익명 함수를 첫 번째 매개 변수로 전달할 수 있습니다.

$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] 
관련 문제