PHP中带键的数组映射

16

仅出于好奇(我知道可以使用单行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是相当无用的,因为你无法为返回的数组指定键。


3
也许不行,但你可以编写自己的函数 :) - Felix Kling
2
array_map可以接受一个自定义函数,你可以使用它来指定数组的键。 - Ariel
1
@Ariel 怎么做?我找不到一种方法来为 array_map 返回的数组指定键。 - lorenzo-s
2
这就是诀窍:返回array_reduce($options,function(&$r,$x){ $r[$x->property] = $x->property2; return $r;}); - Arnold Roa
1
你可以使用array_column($arr, 'name', 'id'); 你也可以在我的答案中查看更多细节。 - Sachin Sarola
显示剩余3条评论
5个回答

29

只需使用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()
);

这是一条从注释中提取出来的单行代码 ^^


5

我发现我可以做:

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

但这很丑,并且需要在同一个数组上执行两个完整的循环。


1
你最好手动完成这个操作(例如使用foreach循环)- 这样可能比现在的方法更快。 - Ariel

4

最简单的方法是使用array_column()函数。

$result_arr = array_column($arr, 'name', 'id');
print_r($result_arr );

输出

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

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');

如果省略第二个参数,则对象本身将用作结果数组中的值。
* 由我开发

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

抱歉,我正在用手机回答。无法编辑代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接