web-dev-qa-db-ja.com

stdClassオブジェクトの配列から列を実装する方法を教えてください。

stdClassオブジェクトの配列があり、それらすべてのstdClassオブジェクトの1つの特定のフィールドを使用してコンマ区切りのリストを作成したいと思います。私の配列は次のようになります:

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

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

そして、その配列内のすべてのfooオブジェクトのstdClassに内破して、コンマ区切りのリストを作成したいと思います。したがって、望ましい結果は次のとおりです。

4,16,76

このオブジェクトの配列をループに通さずに、implode(または他のミステリー関数)でこれを行う方法はありますか?

17
ubiquibacon

array_map() およびimplode() ..を使用できます。

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

$a = implode(", ", $a);
35
alex

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

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

これも私が見た中で最もクリーンな解決策のようです。

7
Kristofer Doman

Rayが提案するように、実際にはクラスに __toString() を設定できますが、最初にarrayを繰り返す必要はありません。 implode() は、オブジェクトの__toString()関数を直接呼び出します(これは連想配列でも機能します)。

6
osteel

PHP 7.0+では、これにarray_columnを使用できます。

echo implode(',', array_column($a, 'foo'));
6
Don't Panic

これに対する非常に巧妙な解決策は、配列を単一の値に減らす array_reduce() 関数です。

$str = array_reduce($a, function($v, $w) {
    if ($v) $v .= ',';
    return $v . $w->foo;
});
5
Niko
echo implode("','",(array)$data->stdArray);
1
Jason

最も簡単な方法は、IDインデックス付き配列を作成してから、array_keysでimplodeを呼び出すことだと思います。

$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
shadyyx

いいえ、できる最善の方法は、繰り返し処理し、オブジェクトでtostring()を呼び出し、その結果を新しい配列に入れてimplodeを呼び出すことです。

0
Ray

それが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));
}

タイプ別のマルチレベルプロセスを含めることもできますが、まだ必要ありませんでした。お役に立てれば。

MySQLオブジェクトを配列に戻すのに便利です。

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