【问题标题】:How to covert array of objects to array of key-value pairs?如何将对象数组转换为键值对数组?
【发布时间】:2019-01-14 01:48:27
【问题描述】:

我从 Laravel 查询生成器中获得了一组对象:

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

我想把它变成这样:

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

【问题讨论】:

  • 你能分享那个 laravel 代码吗?

标签: php arrays laravel


【解决方案1】:

你可以试试这个——

// decode the json
$data = json_decode($array, true);
$final = array_column($data, "code", "name");

json_decode 将解码 JSON 字符串并返回数组。

array_column 将返回提供的键的值。

【讨论】:

  • 在这种情况下它永远不会起作用。那么可能是一个子数组。
  • 您不需要使用 array_column 两次或 array_combine。 $final = array_column($data, "code", "name"); 与您的代码相同。
  • 完全忘记了第三个参数。谢谢。
【解决方案2】:

如果有多个同名的人,则不能使用 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

【讨论】:

    【解决方案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

    【讨论】:

    • pluck 也可以。只需要先转换json字符串。
    猜你喜欢
    • 2021-02-14
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2017-08-25
    相关资源
    最近更新 更多