Отображение массива в PHP с ключами
Просто для любопытства (я знаю, что это может быть однострочный оператор foreach
), есть ли какая-либо функция PHP-массива (или комбинация из многих), которая задала такой массив:
Array (
[0] => stdClass Object (
[id] => 12
[name] => Lorem
[email] => [email protected]
)
[1] => stdClass Object (
[id] => 34
[name] => Ipsum
[email] => [email protected]
)
)
И, учитывая 'id'
и 'name'
, вы получите что-то вроде:
Array (
[12] => Lorem
[34] => Ipsum
)
Я использую этот шаблон много, и я заметил, что array_map
совершенно бесполезен в этом случае, потому что вы не можете указать ключи для возвращенного массива.
Ответы
Ответ 1
Просто используйте array_reduce
:
$obj1 = new stdClass;
$obj1 -> id = 12;
$obj1 -> name = 'Lorem';
$obj1 -> email = '[email protected]';
$obj2 = new stdClass;
$obj2 -> id = 34;
$obj2 -> name = 'Ipsum';
$obj2 -> email = '[email protected]';
$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()
);
Это однострочный комментарий из комментариев ^^
Ответ 2
Я нашел, что могу сделать:
array_combine(array_map(function($o) { return $o->id; }, $objs), array_map(function($o) { return $o->name; }, $objs));
Но он уродлив и требует двух целых циклов в одном массиве.
Ответ 3
Поскольку ваш массив является массивом объекта, вы можете вызвать (его как переменную класса), попробуйте вызвать с помощью этого:
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>";
Жаль, что я отвечаю на ручную. Невозможно отредактировать код
Ответ 4
Самый простой способ - использовать порт LINQ, например YaLinqo library *. Он позволяет выполнять SQL-запросы на массивы и объекты. Функция toDictionary
принимает два обратных вызова: один возвращающий ключ массива результатов и одно возвращаемое значение. Например:
$userNamesByIds = from($users)->toDictionary(
function ($u) { return $u->id; },
function ($u) { return $u->name; }
);
Или вы можете использовать более короткий синтаксис с использованием строк, что эквивалентно приведенной выше версии:
$userNamesByIds = from($users)->toDictionary('$v->id', '$v->name');
Если второй аргумент опущен, сами объекты будут использоваться как значения в массиве результатов.
*, разработанный мной
Ответ 5
Самый простой способ - использовать array_column()
$result_arr = array_column($arr, 'name', 'id');
print_r($result_arr );