14

好奇心のために(私はそれが単一行のforeachステートメントである可能性があることを知っています)、次のような配列を与えるいくつかのPHP配列関数(または多くの組み合わせ)がありますか?

Array (
    [0] => stdClass Object (
        [id] => 12
        [name] => Lorem
        [email] => lorem@example.org
    )
    [1] => stdClass Object (
        [id] => 34
        [name] => Ipsum
        [email] => ipsum@example.org
    )
)

そして、与えられ'id''name'、は、次のようなものを生成します。

Array (
    [12] => Lorem
    [34] => Ipsum
)

私はこのパターンをよく使用しarray_mapますが、このシナリオでは、返される配列のキーを指定できないため、まったく役に立たないことに気付きました。

4

5 に答える 5

27

使用するだけarray_reduceです:

$obj1 = new stdClass;
$obj1 -> id = 12;
$obj1 -> name = 'Lorem';
$obj1 -> email = 'lorem@example.org';

$obj2 = new stdClass;
$obj2 -> id = 34;
$obj2 -> name = 'Ipsum';
$obj2 -> email = 'ipsum@example.org';

$reduced = array_reduce(
    // input array
    array($obj1, $obj2),
    // fold function
    function(&$result, $item){ 
        // at each step, push name into $item->id position
        $result[$item->id] = $item->name;
        return $result;
    },
    // initial fold container [optional]
    array()
);

コメントのワンライナーです^^

于 2012-09-08T13:52:50.780 に答える
4

私は私ができることがわかりました:

array_combine(array_map(function($o) { return $o->id; }, $objs), array_map(function($o) { return $o->name; }, $objs));

しかし、それは醜く、同じアレイ上で2つの全体のサイクルを必要とします。

于 2012-08-21T09:07:32.267 に答える
0

最も簡単な方法は、 YaLinqoライブラリ*のようなLINQポートを使用することです。配列やオブジェクトに対してSQLのようなクエリを実行できます。そのtoDictionary関数は2つのコールバックを受け入れます。1つは結果配列のキーを返し、もう1つは値を返します。例えば:

$userNamesByIds = from($users)->toDictionary(
    function ($u) { return $u->id; },
    function ($u) { return $u->name; }
);

または、文字列を使用して短い構文を使用することもできます。これは、上記のバージョンと同等です。

$userNamesByIds = from($users)->toDictionary('$v->id', '$v->name');

2番目の引数を省略すると、オブジェクト自体が結果配列の値として使用されます。

*私が開発した

于 2015-06-04T13:52:13.413 に答える
0

最も簡単な方法は、array_column()を使用することです。

$result_arr = array_column($arr, 'name', 'id');
print_r($result_arr );
于 2019-09-26T08:22:31.220 に答える
-1

配列はオブジェクトの配列であるため、(クラスの変数のように)次のように呼び出すことができます。

 foreach ($arrays as $object) {
    Echo $object->id;
    Echo "<br>";
    Echo $object->name;
    Echo "<br>";
    Echo $object->email;
    Echo "<br>";
 } 

その後、あなたはすることができます

 // your array of object example $arrays;
 $result = array();
 foreach ($arrays as $array) {
       $result[$array->id] = $array->name;
 }

   echo "<pre>";
   print_r($result);
   echo "</pre>";

申し訳ありませんが、携帯電話でお答えしています。コードを編集できません

于 2012-09-08T13:14:22.213 に答える