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