只是出于好奇(我知道它可以是单行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
在这种情况下是无用的,因为你无法为返回的数组指定键。
答案 0 :(得分:22)
只需使用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()
);
这是评论中的单行^^
答案 1 :(得分:2)
我发现我可以做到:
array_combine(array_map(function($o) { return $o->id; }, $objs), array_map(function($o) { return $o->name; }, $objs));
但它很难看,需要在同一个阵列上进行两个完整的循环。
答案 2 :(得分:0)
因为你的数组是对象数组,所以你可以调用它(类似于类的变量)尝试用这个调用:
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>";
抱歉,我正在接听电话。无法编辑代码
答案 3 :(得分:0)
最简单的方法是使用像YaLinqo库*这样的LINQ端口。它允许对数组和对象执行类似SQL的查询。它的toDictionary
函数接受两个回调:一个返回结果数组的键,一个返回值。例如:
$userNamesByIds = from($users)->toDictionary(
function ($u) { return $u->id; },
function ($u) { return $u->name; }
);
或者您可以使用更短的语法使用字符串,这相当于上面的版本:
$userNamesByIds = from($users)->toDictionary('$v->id', '$v->name');
如果省略第二个参数,则对象本身将用作结果数组中的值。
*由我开发
答案 4 :(得分:0)
最简单的方法是使用array_column()
$result_arr = array_column($arr, 'name', 'id');
print_r($result_arr );