如何将对象数组转换为键值对数组?

时间:2018-08-07 04:29:31

标签: php arrays laravel

我从Laravel查询构建器获得了一系列对象:

[
 {
   "name": "John",
   "code": "006"
 },
 {
   "name": "James"
   "code": "007"
 },
 {
   "name": "Jone"
   "code": "008"
 }
]

我想把它变成这个:

[
  "John"  => "006",
  "James" => "007",
  "Jone"  => "008"
]

3 个答案:

答案 0 :(得分:3)

如果有数组:

\Illuminate\Support\Arr::pluck($array, 'code', 'name');
array_pluck($array, 'code', 'name');

如果您有收藏集:

$collection->pluck('code', 'name');

您可能还从查询中删除了

$query->pluck('code', 'name'); // instead of the `get` call 

取决于Laravel版本,此方法可能是lists

Laravel 5.6 Docs - Helpers - array_pluck

Laravel 5.6 Docs - Collections - Method pluck

Laravel 5.6 Docs - Query Builder - Retrieving Results

答案 1 :(得分:2)

您可以尝试-

else

// decode the json $data = json_decode($array, true); $final = array_column($data, "code", "name"); 将解码JSON字符串并返回数组。

array_column将返回提供的键的值。

答案 2 :(得分:1)

如果有多个同名的人,则不能使用array_combine。

此方法使用array_intersect来查找与名称匹配的代码,并在所有代码的每个名称上创建一个子数组。

$arr = json_decode($str, true);
$names = array_column($arr, "name");
$codes = array_column($arr, "code");

foreach(array_unique($names) as $name){
    $new[$name] = array_intersect_key($codes, array_intersect($names, [$name]));
}
var_dump($new);

输出:

array(3) {
  ["John"]=>
  array(2) {
    [0]=>
    string(3) "006"
    [3]=>
    string(3) "010"
  }
  ["James"]=>
  array(1) {
    [1]=>
    string(3) "007"
  }
  ["Jone"]=>
  array(1) {
    [2]=>
    string(3) "008"
  }
}

https://3v4l.org/Tj4Dd