将Laravel对象转换为数组

32

Laravel输出:

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

    )

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

    )

)

我想将这个转换为普通数组。只想去掉那个stdClass Object 。我也试过使用->toArray() 但是我得到了一个错误:

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

我该如何解决这个问题?

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


这个对象是来自数据库的吗?我没有用过 Laravel,但也许它们有一个 API 可以返回一个关联数组而不是对象。没必要将整个对象转换然后再传输到另一个数组。 - Kevin
是的,它来自数据库。 - Your Friend
重复的问题?https://dev59.com/jIjca4cB1Zd3GeqPrxp4#35414167 - Stefano Groenland
14个回答

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

或者当toArray()失败,因为它是一个stdClass对象时

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

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

将PHP对象转换为关联数组


39

自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);

对于 Laravel 5.4 及以上版本(Ver > 5.4),请查看 fetch mode 部分,详见 https://laravel.com/docs/5.4/upgrade

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

我认为你应该在你的问题中加入这一点,这将改变所有查询的获取模式,而不仅仅是这一个。但知道也可以通过这种方式进行更改。 - Marcin Nabiałek
是的,除非你还原它,否则它将影响此请求的所有查询。已编辑以使其清晰。 - Jarek Tkaczyk
你也可以编辑config/database.php文件,将'fecth' => PDO::FETCH_CLASS替换为PDO::FETCH_ASSOC。 - Tim Wong
这在 Laravel 5.4 及以上版本中已经不再适用。他们已经将其废弃。 - Benyamin Limanto

19

万一还有人在寻找答案,可以使用纯PHP完成。更简单的方法是将对象反向json化。

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

12

这对我起作用:

$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());

8

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

// application/config/database.php

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

希望这能有所帮助。

6

这在 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


6

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

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

5

也可以将一个对象强制转换成数组。这个方法在我的这个例子中有效。

(array) $object;

将会把对象转换成数组。

stdClass Object
(
    [id] => 4
)

to

Array(
    [id] => 4
)

当我在尝试将查询生成器中的数据传递到视图时,遇到了相同的问题。由于数据是以对象形式呈现的,因此您可以这样做:

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

在您的代码中,您可以使用变量来表示不同的值。例如:
{{ $id }}

2
您需要遍历该数组。
for ($i = 0, $c = count($array); $i < $c; ++$i) {
    $array[$i] = (array) $array[$i];
}

使用 (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 对象已转换为数组。


我尝试了两种方法,但是出现了相同的错误:“在非对象上调用成员函数 toArray()”。 - Your Friend
@user3436481 你尝试过像我在答案中展示的那样仅使用(array)吗?你应该编辑你的问题并展示你如何获取数据以及如何使用数组转换。 - Marcin Nabiałek
我正在从Laravel数据库获取数据...它使用std class...数据完全相同... - Your Friend
如果您正确使用Laravel,则应使用模型对象和集合,而不是StdClass对象。 - Mark Baker
1
@MarkBaker 不,只有Eloquent可以这样做。如果您使用简单的Query\Builder,它将返回完全相同的array of stdObjects(默认情况下,取决于数据库配置)。 - Jarek Tkaczyk

2
将对象转换为数组。
$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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接