为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 eloquent 对象转换为零深度数组?

如何将 eloquent 对象转换为零深度数组?

PHP
米脂 2021-09-18 21:38:46
我有一个 eloquent 对象,其中包含来自模型的数据,我需要将其转换为数组,并在相同的数组深度具有来自关系的所有索引。我尝试了array_flatten(), map(), filter()其他 PHP 方法,但无法正常工作。我如何获得我的关系:    $data = Person::whereIn('id', $this->id[0])->where('school_id', '=',     $this->school)->with(['personinfo'=>function ($query) {        $query->select(            'person_id',            'general_info',        );    }, 'trades'=>function ($query) {        $query->select('person_id', 'trade_id')->with('trades');    }, 'measurements'=>function ($query) {        $query->select(            'person_id',            'measuring_point_1',            'measuring_point_1_date',        );    }])->get();    return $data->toArray();下面的数组是什么结果,这是我使用不同方法所能得到的最接近的结果。这是返回函数的结果:array:3 [  1 => array:17 [    "school_id" => 6    "birth_date" => null    "sex_id" => 1    "phone_number" => 62452676867897    "mobile_number" => 62398356786787    "email" => "example@example.com"    "personinfo" => array:5 [      "person_id" => 21      "general_info" => null      "health_info" => null    ]    "trades" => array:3 [      "person_id" => 21      "trade_id" => 2      "trades" => array:8 [        "school_id" => 2        "name" => "blablabla"      ]    ]    "measurements" => array:7 [      "person_id" => 21      "measuring_point_1" => null      "measuring_point_1_date" => null    ]  ]];我需要数组是这样的:array:3 [  1 => array:17 [    "school_id" => 6    "birth_date" => null    "sex_id" => 1    "phone_number" => 624176676867897    "mobile_number" => 649498356786787    "email" => "example@example.com"    "person_id" => 21    "general_info" => null    "health_info" => null    "person_id" => 21    "trade_id" => 2    "school_id" => 2    "name" => "blablabla"    "person_id" => 21    "measuring_point_1" => null    "measuring_point_1_date" => null    ]  ]];基本上,我需要将多维数组转换为零深度数组。任何帮助,将不胜感激。
查看完整描述

2 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

您可以使用自定义的 array flatten 将内部与array-merge 合并为:


function arrayFlatten($array) {

   $res = array();

   foreach ($array as $k => $v) {

       if (is_array($v)) $return = array_merge($res, array_flatten($v)); // add recursively

       else $res[$k] = $v; // just add

   }

   return $res;

}

现在只需返回 arrayFlatten($data->toArray());

简单的现场示例


查看完整回答
反对 回复 2021-09-18
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

我是如何使用dWinder的答案让它工作的


       $data = Person::whereIn('id', $this->id[0])->where('school_id', '=', $this->school)->with(['personinfo'=>function ($query) {

        $query->select(

            'person_id',

            'general_info',

        );

    }, 'trades'=>function ($query) {

        $query->select('person_id', 'trade_id')->with('trades');

    }, 'measurements'=>function ($query) {

        $query->select(

            'person_id',

            'measuring_point_1',

            'measuring_point_1_date',

        );

    }])->get();



function array_flatten($array)

    {

        $return = array();

        foreach ($array as $key => $value) {

            if (is_array($value)) {

                $return = array_merge($return, array_flatten($value));

            } else {

                $return[$key] = $value;

            }

        }

        return $return;

    }


    foreach ($data as $value) {

        $result[] = array_flatten($value->toArray());

    }



    return $result;


查看完整回答
反对 回复 2021-09-18
  • 2 回答
  • 0 关注
  • 271 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信