【问题标题】:How do I convert eloquent object to a zero depth array? [duplicate]如何将 eloquent 对象转换为零深度数组? [复制]
【发布时间】:2019-11-12 23:38:22
【问题描述】:

我有一个雄辩的对象,其中包含来自模型的数据,我需要将其转换为数组,并具有来自相同数组深度的关系的所有索引。

我尝试了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
    ]
  ]
];

基本上,我需要将多维数组转换为零深度数组。

任何帮助将不胜感激。

【问题讨论】:

  • 我不明白你参加了什么以及你实际得到了什么。通常 toArray() 函数效果很好
  • 嗨@GiacomoMasseroniChiaro,我想将多维数组转换为零深度数组。
  • 唯一的方法就是循环数组并创建自己的新数组
  • 谢谢,可以尝试一下重构
  • 另一种选择是使用 QueryBuilder。您可以直接加入,而不是使用雄辩的关系。这将在没有任何后期处理的情况下实现相同的效果。

标签: php arrays object multidimensional-array laravel-5.8


【解决方案1】:

您可以使用自定义的数组展平,将内部与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());

简单live example

【讨论】:

  • 请通过关闭重复的问题而不是回答来帮助做家务。 stackoverflow.com/a/14972389/2943403
  • 我不认为这是一个重复的问题,因为这是一个与 laravel 相关的问题,而不是专门的多维数组。您建议使用 QueryBuilder 权利而不是修改结果对吗? @mickmackusa
  • 接受的答案是直接从欺骗页面上的答案中提取的。边缘抄袭。
【解决方案2】:

我是如何使用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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-02
    • 2021-05-27
    • 2014-11-03
    • 2015-10-02
    • 2020-11-30
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    相关资源
    最近更新 更多