2012-05-31 11 views
11

私はstdClassオブジェクトの配列を持っていて、それらのオブジェクトすべての特定のフィールドを使ってコンマ区切りのリストを作成したいと思います。私の配列は次のようになります。stdClassオブジェクトの配列にimplodeを使用するにはどうすればよいですか?

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

そして私は、カンマ区切りのリストを作成するために、その配列内のすべてのstdClassオブジェクトのfooに内破したいです。だから、望ましい結果は次のとおりです。

4,16,76 

は、ループを通って、オブジェクトのこの配列を置くことなく、破(または他のいくつかの謎の機能)でこれを行う方法はありますか?

+0

となります。 – clentfort

答えて

25

あなたがarray_map()implode() ...

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

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

これは動作し、ループよりもクリーンですが、残念ながらforeachループがうまく動作することがわかりました。私はarray_reduceで同様の結果を得ています:(私はちょうどforeachループに固執すると思います。 – ubiquibacon

0

を使用することができ、私は最も簡単な方法は、ID、インデックス付きの配列を作成し、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

いいえ、あなたができることは、繰り返し実行することです。オブジェクトのtostring()を呼び出し、結果を新しい配列に入れてimplodeを呼び出します。このため

4

非常にきちんとした解決策は、単一の値に配列を軽減array_reduce()機能、次のとおりです。

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

それは1レベルのオブジェクトの場合、これは私のために働きました。

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

by-typeのマルチレベルプロセスを含めることはできますが、まだ必要ありませんでした。 これが役立つことを願っています。

MySQLオブジェクトをアレイに戻すためのHandy。

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

レイによって示唆されているようにあなたが実際にクラスに__toString()を設定することができますが、array最初を反復処理する必要はありません。 implode()は、オブジェクトの関数__toString()を直接呼び出します(連想配列btwでも機能します)。

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

これは実際に私が見つけた最良の方法です。オブジェクトの配列は動的なサイズを処理できるはずですから、ここでは正しく答えられないようです。

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

これは私が見た最もクリーンな解決策でもあるようです。おそらくオブジェクトのtoString()メソッドをオーバーロードした場合は、

関連する問題