【问题标题】:Convert laravel object to array将 laravel 对象转换为数组
【发布时间】:2014-11-28 05:39:30
【问题描述】:

Laravel 输出:

Array
(
    [0] = stdClass Object
    (
        [ID] = 5

    )

    [1] = stdClass Object
    (
        [ID] = 4

    )

)

我想把它转换成普通数组。只想删除stdClass Object。我也尝试过使用->toArray();,但出现错误:

在非对象上调用成员函数 toArray()。

我该如何解决这个问题?

功能已在http://www.srihost.com上实现

【问题讨论】:

  • 这个对象是否来自数据库?我没有使用过 laravel,但也许有一个 API 会产生关联数组而不是对象。无需转换整个对象,然后将它们转移到另一个数组中
  • 是的,它来自 DB..

标签: php arrays laravel laravel-4 laravel-3


【解决方案1】:

你需要遍历数组

for ($i = 0, $c = count($array); $i < $c; ++$i) {
    $array[$i] = (array) $array[$i];
}

ans 使用 (array) 转换,因为您有 Std 类的对象数组而不是对象本身

示例:

$users = DB::table('users')->get();

var_dump($users);

echo "<br /><br />";

for ($i = 0, $c = count($users); $i < $c; ++$i) {
    $users[$i] = (array) $users[$i];
}
var_dump($users);
exit;

输出是:

array(1) { [0]=> object(stdClass)#258 (8) { ["id"]=> int(1) ["user_name"]=> string(5) "admin" ["email"]=> string(11) "admin@admin" ["passwd"]=> string(60) "$2y$10$T/0fW18gPGgz0CILTy2hguxNpcNjYZHsTyf5dvpor9lYMw/mtKYfi" ["balance"]=> string(4) "0.00" ["remember_token"]=> string(60) "moouXQOJFhtxkdl9ClEXYh9ioBSsRp28WZZbLPkJskcCr0325TyrxDK4al5H" ["created_at"]=> string(19) "2014-10-01 12:00:00" ["updated_at"]=> string(19) "2014-09-27 12:20:54" } }

array(1) { [0]=> array(8) { ["id"]=> int(1) ["user_name"]=> string(5) "admin" ["email"]=> string(11) "admin@admin" ["passwd"]=> string(60) "$2y$10$T/0fW18gPGgz0CILTy2hguxNpcNjYZHsTyf5dvpor9lYMw/mtKYfi" ["balance"]=> string(4) "0.00" ["remember_token"]=> string(60) "moouXQOJFhtxkdl9ClEXYh9ioBSsRp28WZZbLPkJskcCr0325TyrxDK4al5H" ["created_at"]=> string(19) "2014-10-01 12:00:00" ["updated_at"]=> string(19) "2014-09-27 12:20:54" } } 

正如预期的那样。 stdClass 的对象已转换为数组。

【讨论】:

  • 我尝试了这两种方法.. 相同的错误Call to a member function toArray() on a non-object
  • @user3436481 您是否尝试过仅使用(array),正如我在回答中显示的那样?您应该编辑您的问题并展示您如何准确获取数据以及如何使用数组转换
  • 我正在从 laravel 数据库中获取数据...它使用std class ...数据完全相同.....
  • 如果你正确使用 Laravel,它会使用模型对象和集合,而不是 StdClass 对象
  • @MarkBaker 不,只有 Eloquent 可以做到。如果您使用简单的Query\Builder,它将完全返回stdObjects 中的array(默认情况下,取决于数据库配置)
【解决方案2】:

您还可以通过更改将所有结果始终作为数组获取

// application/config/database.php

'fetch' => PDO::FETCH_CLASS,
 // to
'fetch' => PDO::FETCH_ASSOC,

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    自 Laravel 5.4 版开始更新,不再可能。

    您可以更改您的数据库配置,就像@Varun 建议的那样,或者如果您只想在这种情况下这样做,那么:

    DB::setFetchMode(PDO::FETCH_ASSOC);
    
    // then
    DB::table(..)->get(); // array of arrays instead of objects
    
    // of course to revert the fetch mode you need to set it again
    DB::setFetchMode(PDO::FETCH_CLASS);
    

    适用于 5.4 以上的新 Laravel (Ver > 5.4) 见https://laravel.com/docs/5.4/upgrade获取模式部分

    Event::listen(StatementPrepared::class, function ($event) {
        $event->statement->setFetchMode(...);
    });
    

    【讨论】:

    • 我认为你应该添加到你的问题中,这将改变所有查询的获取模式,而不仅仅是这个。但很高兴知道它也可以这样改变
    • 是的,除非您还原它,否则它将影响此请求的所有查询。编辑清楚。
    • 你也可以编辑config/database.php,将'fecth' => PDO::FETCH_CLASS 改为 PDO::FETCH_ASSOC
    • 自 5.4 版以来这不再适用于新的 laravel,他们将其废弃
    【解决方案4】:
    foreach($yourArrayName as $object)
    {
        $arrays[] = $object->toArray();
    }
    // Dump array with object-arrays
    dd($arrays);
    

    或者当toArray() 因为它是一个标准类而失败时

    foreach($yourArrayName as $object)
    {
        $arrays[] =  (array) $object;
    }
    // Dump array with object-arrays
    dd($arrays);
    

    不工作?也许你可以在这里找到答案:

    Convert PHP object to associative array

    【讨论】:

      【解决方案5】:

      我建议您只需在您的方法中执行此操作

      public function MyAwesomeMethod($returnQueryAs = null)
      {
          $tablename = 'YourAwesomeTable';
      
          if($returnQueryAs == 'array')
          {
              DB::connection()->setFetchMode(PDO::FETCH_ASSOC);
          }
      
          return DB::table($tablename)->get();
      }
      

      有了这个,你只需要传递字符串'array'作为你的参数,瞧!返回一个关联数组。

      【讨论】:

      • 第一行末尾有一个不必要的引号,会破坏格式。
      【解决方案6】:

      这对我有用:

      $data=DB::table('table_name')->select(.......)->get();
      $data=array_map(function($item){
          return (array) $item;
      },$data);
      

      $data=array_map(function($item){
          return (array) $item;
      },DB::table('table_name')->select(.......)->get());
      

      【讨论】:

        【解决方案7】:

        如果只想获取数组中的ID,可以使用array_map:

            $data = array_map(function($object){
                return $object->ID;
            }, $data);
        

        这样,在每个位置返回一个带有 ID 的数组。

        【讨论】:

          【解决方案8】:

          它非常简单。你可以这样使用:-

          Suppose You have one users table and you want to fetch the id only
          $users = DB::table('users')->select('id')->get();
          $users = json_decode(json_encode($users)); //it will return you stdclass object
          $users = json_decode(json_encode($users),true); //it will return you data in array
          echo '<pre>'; print_r($users);
          

          希望对你有帮助

          【讨论】:

            【解决方案9】:

            这在 laravel 5.4 中对我有用

            $partnerProfileIds = DB::table('partner_profile_extras')->get()->pluck('partner_profile_id');
            $partnerProfileIdsArray = $partnerProfileIds->all();
            

            输出

            array:4 [▼
              0 => "8219c678-2d3e-11e8-a4a3-648099380678"
              1 => "28459dcb-2d3f-11e8-a4a3-648099380678"
              2 => "d5190f8e-2c31-11e8-8802-648099380678"
              3 => "6d2845b6-2d3e-11e8-a4a3-648099380678"
            ]
            

            https://laravel.com/docs/5.4/collections#method-all

            【讨论】:

              【解决方案10】:

              以防万一有人仍然在这里寻找答案。可以使用纯 PHP 来完成。 一种更简单的方法是对对象进行反向 json。

              function objectToArray(&$object)
              {
                  return @json_decode(json_encode($object), true);
              }
              

              【讨论】:

                【解决方案11】:

                使用toArray()方法将对象转换为数组:

                $foo = Bar::first(); // Get object
                $foo = $foo->toArray(); // Convert object to array
                

                【讨论】:

                  【解决方案12】:
                  $res = ActivityServer::query()->select('channel_id')->where(['id' => $id])->first()->attributesToArray();
                  

                  我使用get(),它返回一个对象,我使用attributesToArray()将对象属性更改为一个数组。

                  【讨论】:

                    【解决方案13】:

                    也可以将对象类型转换为数组。这对我有用。

                    (array) $object;

                    会转化

                    stdClass Object
                    (
                        [id] => 4
                    )
                    

                    Array(
                        [id] => 4
                    )
                    

                    在尝试将数据从查询生成器传递到视图时遇到了同样的问题。因为数据是作为对象来的。所以你可以这样做:

                    $view = view('template', (array) $object);
                    

                    在您看来,您使用的变量像

                    {{ $id }}
                    

                    【讨论】:

                      【解决方案14】:

                      对象到数组

                      $array = (array) $players_Obj;  
                      
                      $object = new StdClass;
                      $object->foo = 1;
                      $object->bar = 2;
                      
                      var_dump( (array) $object );
                      

                      输出:

                      array(2) {
                          'foo' => int(1)
                          'bar' => int(2)
                      }
                      

                      【讨论】:

                        猜你喜欢
                        • 2019-09-18
                        • 2017-06-30
                        • 2021-02-11
                        • 2013-10-20
                        • 2016-03-14
                        • 2018-08-09
                        • 2019-11-15
                        相关资源
                        最近更新 更多