php 将对象转成数组,关于php:将laravel对象转换为数组

这篇博客讨论了在Laravel中如何将查询结果从对象转换为数组,特别是处理 stdClass 对象。提供了多种解决方案,包括使用 `toArray()`(在某些情况下可能无效),设置数据库查询的获取模式为 `PDO::FETCH_ASSOC`,使用 `array_map` 结合 `(array)` 转换,以及 `json_decode` 结合 `json_encode` 方法。文章还包含了社区成员提供的不同代码示例和建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Laravel输出:

Array

(

[0] = stdClass Object

(

[ID] = 5

)

[1] = stdClass Object

(

[ID] = 4

)

)

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

Call to a member function toArray() on a non-object.

我怎样才能解决这个问题?

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

该对象是否来自数据库? 我还没有使用过laravel,但是也许有一个API可以生成一个关联数组而不是对象。 无需转换整个对象,然后将它们转移到另一个数组中

是的,它来自数据库。

有重复的问题吗? stackoverflow.com/questions/28658891/

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

我认为您应该添加一个问题,这不仅将更改所有查询的获取模式。但是很高兴知道也可以这样改变

是的,除非您将其还原,否则它将影响此请求的所有查询。编辑清楚。

您还可以编辑config / database.php,将fecth => PDO :: FETCH_CLASS替换为PDO :: FETCH_ASSOC

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对象转换为关联数组

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

// application/config/database.php

'fetch' => PDO::FETCH_CLASS,

// to

'fetch' => PDO::FETCH_ASSOC,

希望这会有所帮助。

谢谢,这很有帮助...

像我需要的那样工作。

这为我工作:

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

这在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/api/5.4/Illuminate/Support/Collection.html#method_all

以防万一有人仍在这里寻找答案。可以使用普通的PHP来完成。

一种更简单的方法是对对象进行反向json处理。

function objectToArray(&$object)

{

return @json_decode(json_encode($object), true);

}

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

$data = array_map(function($object){

return $object->ID;

}, $data);

这样,在每个pos中返回一个ID为ID的数组。

您需要遍历数组

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"
";

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(默认情况下,取决于数据库配置)

好,我站好了

@MarcinNabia?ek工作,但是它太夸张了。

$res = ActivityServer::query()->select('channel_id')->where(['id' => $id])->first()->attributesToArray();

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

$ foo = Bar :: getBeers();

$ foo = $ foo-> toArray();

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

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 '[cc lang="php"]'; print_r($users);

希望能帮助到你

我建议您只是在您的方法内执行此操作

public function MyAwesomeMethod($returnQueryAs = null)

{

$tablename = 'YourAwesomeTable';

if($returnQueryAs == 'array')

{

DB::connection()->setFetchMode(PDO::FETCH_ASSOC);

}

return DB::table($tablename)->get();

}

有了这些,您只需传递字符串'array'作为参数,然后瞧瞧!返回一个关联数组。

第一行的末尾有一个不必要的引号,这会破坏格式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值