在laravel中将对象转换为数组[重复]

Posted

技术标签:

【中文标题】在laravel中将对象转换为数组[重复]【英文标题】:Converting object to array in laravel [duplicate] 【发布时间】:2015-04-23 21:32:32 【问题描述】:

我查询了这样的数据库,得到了一个数组:

foreach($oid as $orderid) 
    $orderdetailData[] = DB::table('order_details')
        ->join('orders', 'order_details.oid', '=', 'orders.oid')
        ->select('order_details.oid', 'orders.ostatus')
        ->where('order_details.oid', $orderid)->get();
    

    $data = array_flatten($orderdetailData);
    return $data;

这是我得到的数组

array (size=2)
  0 => 
    object(stdClass)[174]
      public 'oid' => int 1
      public 'ostatus' => string 'Placed' (length=6)
  1 => 
    object(stdClass)[158]
      public 'oid' => int 2
      public 'ostatus' => string 'Placed' (length=6)

我正在尝试以表格形式获取此数组

array (size=2)
  0 => 
    array (size=2)
      public 'oid' => int 1
      public 'ostatus' => string 'Placed' (length=6)
  1 => 
    array (size=2)
      public 'oid' => int 2
      public 'ostatus' => string 'Placed' (length=6)

我试过这样做:

foreach($orderdetailData as $key => $value)
    $data[] = array_flatten($orderdetailData[$key]);

但是这样做会得到一个这种形式的数组:

array (size=2)
  0 => 
    array (size=1)
      0 => 
        object(stdClass)[174]
          public 'oid' => int 1
          public 'ostatus' => string 'Placed' (length=6)
  1 => 
    array (size=1)
      0 => 
        object(stdClass)[158]
          public 'oid' => int 2
          public 'ostatus' => string 'Placed' (length=6)

这不是我想要的。有人能告诉我这样做的简单方法是什么吗?谢谢

【问题讨论】:

您可以查看SO question的解决方案。它解释了如何将对象转换为数组。 【参考方案1】:

使用array_map 并强制转换为数组就足够了:

$data = array_map(function($object)
    return (array) $object;
, $data);

我也不会在循环中运行查询。您应该尝试从数据库的一个查询中获取该数据。像这样的东西可以工作:

$data = DB::table('order_details')
    ->join('orders', 'order_details.oid', '=', 'orders.oid')
    ->select('order_details.oid', 'orders.ostatus')
    ->whereIn('order_details.oid', $oid)->get();

编辑

正如在另一个答案中提到的那样,让我解释一下如何通过将 PDO 设置为 FETCH_ASSOC 来完成同样的任务:

DB::setFetchMode(PDO::FETCH_ASSOC);
$data = DB::table('order_details') .... ->get();

但是,这会更改请求其余部分的全局获取模式(至少在您不打开新连接的情况下)。为了保存,您应该在之后将其更改回来:

DB::setFetchMode(PDO::FETCH_ASSOC);
$data = DB::table('order_details') .... ->get();
DB::setFetchMode(PDO::FETCH_CLASS);

如果您不确定使用的是什么默认值,甚至可以先备份它:

$fetchModeBefore = DB::getFetchMode();
DB::setFetchMode(PDO::FETCH_ASSOC);
$data = DB::table('order_details') .... ->get();
DB::setFetchMode($fetchModeBefore);

【讨论】:

array_map() 有效。感谢回复,今天学到了新东西:) 谨防由此带来的性能缺陷。 我试图直接从对象中获取值,但出现“无法使用 MyClass 类型的对象作为数组”错误如何直接从类中获取值【参考方案2】:

在 PDO/DB 对象上,您可以将返回样式设置为 assoc。

【讨论】:

现在试试这个:) 感谢您的回复

以上是关于在laravel中将对象转换为数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中将二维数组转换为 json 对象

无法在laravel中将数组数组转换为没有索引的对象数组

在laravel 5.1中将对象转换为数组

在 PHP 中将多维数组转换为 XML 对象 [重复]

在Jackson中将Java对象转换为JsonNode [重复]

在 C# 中将对象数组转换为浮点数组 [关闭]