2012-05-31 18 views
11

Tengo una matriz de stdClass objetos y quiero construir una lista separada por comas usando un campo específico de todos esos objetos stdClass. Mi serie es el siguiente:Cómo usar implode en una matriz de objetos stdClass?

$obj1 = stdClass Object ([foo] => 4 [bar] => 8 [foo-bar] => 15); 
$obj1 = stdClass Object ([foo] => 16 [bar] => 23 [foo-bar] => 42); 
$obj1 = stdClass Object ([foo] => 76 [bar] => 79 [foo-bar] => 83); 

$a = array(1=>$obj1 , 2=>$obj2 , 3=>$obj3); 

Y Quiero implosionar en foo de todos los objetos de esa stdClass matriz para crear una lista separada por comas. Por lo que el resultado deseado es:

4,16,76 

¿Hay alguna manera de hacer esto con implosión (o alguna otra función misterio) sin tener que poner este conjunto de objetos a través de un bucle?

+0

quizás si sobrecarga el método toString() del objeto. – clentfort

Respuesta

25

Usted podría utilizar array_map() y implode() ...

$a = array_map(function($obj) { return $obj->foo; }, 
       array(1=>$obj1 , 2=>$obj2 , 3=>$obj3)); 

$a = implode(", ", $a); 
+0

Esto funciona y es más limpio que un ciclo, desafortunadamente estoy descubriendo que un ciclo foreach funciona mejor. Estoy obteniendo resultados similares con array_reduce :(Supongo que seguiré con el ciclo foreach. – ubiquibacon

0

supongo que la manera más fácil sería para crear una matriz indexada ID y luego llamar a implosionar en array_keys:

$a = array(); 
$a[4] = stdClass Object ([foo] => 4 [bar] => 8 [foo-bar] => 15); 
$a[16] = stdClass Object ([foo] => 16 [bar] => 23 [foo-bar] => 42); 
$a[76] = stdClass Object ([foo] => 76 [bar] => 79 [foo-bar] => 83); 

echo implode(', ', array_keys($a)); 
0

No, el Lo mejor que puede hacer es repetir iteraciones, llamar a tostring() en el objeto y colocar los resultados en una nueva matriz para invocar implode.

4

Una solución muy ordenado para ello es la función array_reduce(), que reduce una matriz a un solo valor:

$str = array_reduce($a, function($v, $w) { 
    if ($v) $v .= ','; 
    return $v . $w->foo; 
}); 
0

Si es un objeto de 1 nivel, esto funcionó para mí.

function implodeObjValues($glue, $obj) { 
    $s = ""; 
    foreach($obj[1] as $n=>$v) { 
     $s .= $glue . $v; 
    } 
    return substr($s,strlen($glue)); 
} 

function implodeObjLabels($glue, $obj) { 
    $s = ""; 
    foreach($obj[1] as $n=>$v) { 
     $s .= $glue . $n; 
    } 
    return substr($s,strlen($glue)); 
} 

Podría incluir un proceso de varios niveles por tipo, pero no lo necesitaba todavía. Espero que esto ayude.

Práctico para convertir el objeto MySQL a matriz.

$db = new mysqli("localhost",$usr,$pw,$db); 
$row = $db->query("SHOW TABLES"); 
$a = implodeObjValues("|",$row); 
5

En realidad se puede establecer __toString() en la clase como se sugiere por Ray, pero que no es necesario para recorrer la primera array. implode() llamará directamente a la función __toString() de los objetos (que también funciona con matrices asociativas, por cierto).

1
echo implode("','",(array)$data->stdArray); 
6

De hecho, esta es la mejor manera que he encontrado, no parece que se responda aquí correctamente ya que la matriz de objetos debería poder manejar el tamaño dinámico.

$str = implode(',', array_map(function($x) { return $x->foo; }, $a)); 

Esto también parece ser la solución más limpia que he visto.

Cuestiones relacionadas