2010-08-18 6 views
6

Estoy intentando 'agradable para la impresión' fuera una matriz, usando una sintaxis como:PHP: cuando se utiliza foreach para recorrer el conjunto, ¿cómo puedo saber si estoy en el último par?

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

Sin embargo, la desventaja obvia de este método es que se mostrará una "" al final de la matriz imprimir, antes del cierre "]". ¿Hay una buena manera de usar la sintaxis de $ key => $ value para detectar si está en el último par de la matriz, o debería cambiar a un ciclo usando each()?

Respuesta

12

Construir una matriz, y luego usar implode:

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

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

¿Qué hace la función 'process()'? –

+0

Lo que quieras ... Disculpa, probablemente debería haberlo nombrado de manera más útil: esa es la parte que el OP debe completar. –

4

Puede recortar el último "," cuando para termina utilizando subcadena.

$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

hacer el procesamiento por separado y luego utilizar implode() para unirse:

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

¿Puedes explicar esta respuesta? Esto es interesante. – Chris

+0

@Chris Olvidé el procesamiento adicional, pero puede usar [implode()] (http://php.net/manual/en/function.implode.php) para unir elementos de la matriz. –

2

Podría ser más fácil que hacerlo así esto, y agrega una coma a la cadena antes del artículo si no es el primer elemento.

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

    //add stuff to $outString 
} 

¿El formato de salida es JSON? Si es así, podría considerar usar json_encode() en su lugar.

+0

aunque no es gran cosa, para mí esto solo agrega complejidad a la eficiencia del algoritmo cuando no lo necesita estar alli. – Chris

+1

Sí, pero el enfoque también es bueno. Es más fácil de encontrar si estamos en el primer elemento que el anterior. Algoritmo útil que puede ser utilizado. – Savageman

1

Se podía hacerlo como normal para bucle:

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

Sin embargo, la mejor manera de hacerlo, en mi humilde opinión, es el almacenamiento de todos los componentes en una matriz, y luego la implosión:

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

implode() toma todos los elementos en una matriz y los junta en una cadena, separados por su primer argumento.

3

No obstante las circunstancias de su ejemplo (unir cadenas con comas, para las cuales implode es la forma correcta de hacerlo), para responder a su pregunta específica, la forma canónica de iterar a través de una matriz y comprobar si está activado el último elemento está utilizando 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 - Nunca he visto documentos incompletos en el sitio PHP antes - "Descripción aquí ..." en todas partes! –

+0

Sí, algunas de las áreas de la documentación no se han desarrollado. He estado trabajando con el material DOMDocument últimamente y es igualmente irregular. Hay documentación auxiliar para el SPL [aquí] (http://www.php.net/~helly/php/ext/spl/), pero no es mucho más útil. – Shabbyrobe

1

Hay muchas posibilidades. Creo que esta es una de las soluciones más simples:

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

Salidas:

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

que tienden a evitar el uso de bucles en situaciones como estas. Debería usar implode() para unir listas con un delimitador común y usar array_map() para manejar cualquier procesamiento en esa matriz antes de la unión. Tenga en cuenta las siguientes implementaciones que deberían expresar la versatilidad de estas funciones. El mapa de matriz puede tomar una cadena (nombre de una función) que representa una función incorporada o función definida por el usuario (primeros 3 ejemplos). Puede pasarle una función usando create_function() o pasar una función lambda/anonymous como primer parámetro.

$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] 
Cuestiones relacionadas