2012-05-31 9 views
11

Mam tablicę obiektów stdClass i chcę zbudować listę rozdzielaną przecinkami przy użyciu jednego konkretnego pola wszystkich tych obiektów stdClass. Moja tablica wygląda następująco:Jak korzystać z implodu na tablicy obiektów 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); 

I chcę implozji na foo wszystkich stdClass obiektów w tej tablicy, aby stworzyć listę oddzielone przecinkami. Tak pożądany wynik to:

4,16,76 

Czy istnieje jakiś sposób, aby to zrobić z implode (lub jakaś inna funkcja tajemnica) bez konieczności umieścić tę tablicę obiektów przez pętlę?

+0

może, jeśli przeciąłeś metodę toString() obiektu. – clentfort

Odpowiedz

25

Można użyć array_map() i implode() ...

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

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

To działa i jest czystsze niż pętla, niestety stwierdzam, że pętla foreach działa lepiej. Otrzymuję podobne wyniki z array_reduce :(Zgadnij, że będę trzymać się pętli foreach. – ubiquibacon

0

Chyba najprostszym sposobem byłoby stworzenie identyfikatora indeksowane tablicę, a następnie zadzwonić implozji na 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

Nie, najlepiej zrobić iterację, wywołać tostring() na obiekcie i umieścić wyniki w nowej tablicy, aby wywołać implode na.

4

Bardzo schludny rozwiązaniem jest funkcja array_reduce(), że zmniejsza tablicę do pojedynczej wartości:

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

Jeśli jest to obiekt 1-poziom, to pracował dla mnie.

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)); 
} 

Może zawierać proces wielopoziomowy typu, ale nie potrzebowałem go jeszcze. Mam nadzieję, że to pomoże.

Poręczny do konwertowania obiektu MySQL z powrotem do tablicy.

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

Rzeczywiście można ustawić __toString() od klasy jako sugerowane przez Ray, ale nie trzeba do iterację array pierwszy. implode() bezpośrednio wywoła funkcję __toString() obiektów (co również działa z tablicami asocjacyjnymi, btw).

6

To jest rzeczywiście najlepszym sposobem znalazłem, to nie wydaje się być tu odpowiedzi właściwie jako tablica obiektów powinny być w stanie obsługiwać dynamiczne rozmiar.

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

To także wydaje się być najczystszym rozwiązaniem, jakie widziałem.

Powiązane problemy