Отображение массива в PHP с ключами

Просто для любопытства (я знаю, что это может быть однострочный оператор 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 совершенно бесполезен в этом случае, потому что вы не можете указать ключи для возвращаемого массива.

Просто используйте 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() ); 

Это однострочный комментарий из комментариев ^^

Я обнаружил, что могу:

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

Но это уродливо и требует двух целых циклов в одном массиве.

Поскольку ваш массив является массивом объекта, вы можете вызвать (его как переменную класса), попробуйте вызвать с помощью этого:

  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>"; 

Извините, я отвечаю на ручную. Невозможно отредактировать код

Самый простой способ – использовать порт LINQ, такой как библиотека YaLinqo *. Он позволяет выполнять SQL-запросы на массивы и объекты. Его функция toDictionary принимает два обратных вызова: один возвращающий ключ массива результатов и одно возвращаемое значение. Например:

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

Или вы можете использовать более короткий синтаксис с использованием строк, что эквивалентно приведенной выше версии:

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

Если второй аргумент опущен, сами объекты будут использоваться как значения в массиве результатов.

* разработан мной