我正在尝试从实体中获取多维数组。
Symfony Serializer已经可以转换为XML,JSON,YAML等,但不能转换为数组。
我需要转换,因为我想有一个干净的var_dump
.我现在的实体几乎没有连接,完全不可读。
我怎样才能做到这一点?
实际上,您可以使用内置的序列化程序将学说实体转换为数组。实际上,我今天刚刚写了一篇关于这个的博客文章:https://skylar.tech/detect-doctrine-entity-changes-without/
你基本上调用规范化函数,它会给你你想要的:
$entityAsArray = $this->serializer->normalize($entity, null);
我建议查看我的帖子以获取有关某些怪癖的更多信息,但这应该完全符合您的要求,而无需任何其他依赖项或处理私有/受保护字段。
显然,可以将对象转换为如下所示的数组:
<?php
class Foo
{
public $bar = 'barValue';
}
$foo = new Foo();
$arrayFoo = (array) $foo;
var_dump($arrayFoo);
这将产生类似以下内容的内容:
array(1) {
["bar"]=> string(8) "barValue"
}
如果您有私有和受保护的属性,请参阅此链接:https://ocramius.github.io/blog/fast-php-object-to-array-conversion/
从存储库查询中获取数组格式的实体
在实体存储库中,您可以选择您的实体并指定您想要一个带有getArrayResult()
方法的数组。
有关详细信息,请参阅原则查询结果格式文档。
public function findByIdThenReturnArray($id){
$query = $this->getEntityManager()
->createQuery("SELECT e FROM YourOwnBundle:Entity e WHERE e.id = :id")
->setParameter('id', $id);
return $query->getArrayResult();
}
如果所有这些都不适合,您应该查看有关ArrayAccess接口的PHP文档。
它以这种方式检索属性: echo $entity['Attribute'];
PHP 8 允许我们将对象转换为数组:
$var = (array)$someObj;
对象只有公共属性很重要,否则你会得到奇怪的数组键:
<?php
class bag {
function __construct(
public ?bag $par0 = null,
public string $par1 = '',
protected string $par2 = '',
private string $par3 = '')
{
}
}
// Create myBag object
$myBag = new bag(new bag(), "Mobile", "Charger", "Cable");
echo "Before conversion : n";
var_dump($myBag);
// Converting object to an array
$myBagArray = (array)$myBag;
echo "After conversion : n";
var_dump($myBagArray);
?>
输出如下:
Before conversion :
object(bag)#1 (4) {
["par0"]=> object(bag)#2 (4) {
["par0"]=> NULL
["par1"]=> string(0) ""
["par2":protected]=> string(0) ""
["par3":"bag":private]=> string(0) ""
}
["par1"]=> string(6) "Mobile"
["par2":protected]=> string(7) "Charger"
["par3":"bag":private]=> string(5) "Cable"
}
After conversion :
array(4) {
["par0"]=> object(bag)#2 (4) {
["par0"]=> NULL
["par1"]=> string(0) ""
["par2":protected]=> string(0) ""
["par3":"bag":private]=> string(0) ""
}
["par1"]=> string(6) "Mobile"
["�*�par2"]=> string(7) "Charger"
["�bag�par3"]=> string(5) "Cable"
}
与序列化程序规范化相比,此方法具有优势 - 这样您就可以将 Object 转换为对象数组,而不是数组数组。
我遇到了同样的问题并尝试了其他 2 个答案。两者都不是很顺利。
$object = (array) $object;
在我的密钥中添加了很多额外的文本名字。- 序列化程序没有使用我的
active
属性,因为它前面没有is
并且是一个boolean
。它还改变了我的数据和数据本身的顺序。
所以我在我的实体中创建了一个新函数:
/**
* Converts and returns current user object to an array.
*
* @param $ignores | requires to be an array with string values matching the user object its private property names.
*/
public function convertToArray(array $ignores = [])
{
$user = [
'id' => $this->id,
'username' => $this->username,
'roles' => $this->roles,
'password' => $this->password,
'email' => $this->email,
'amount_of_contracts' => $this->amount_of_contracts,
'contract_start_date' => $this->contract_start_date,
'contract_end_date' => $this->contract_end_date,
'contract_hours' => $this->contract_hours,
'holiday_hours' => $this->holiday_hours,
'created_at' => $this->created_at,
'created_by' => $this->created_by,
'active' => $this->active,
];
// Remove key/value if its in the ignores list.
for ($i = 0; $i < count($ignores); $i++) {
if (array_key_exists($ignores[$i], $user)) {
unset($user[$ignores[$i]]);
}
}
return $user;
}
我基本上将所有属性添加到新的$user
数组中,并创建了一个额外的$ignores
变量,以确保可以忽略属性(如果您不想要所有属性)。
您可以在控制器中使用它,如下所示:
$user = new User();
// Set user data...
// ID and password are being ignored.
$user = $user->convertToArray(["id", "password"]);
我将这个特征添加到实体中:
<?php
namespace ModelTraits;
/**
* ToArrayTrait
*/
trait ToArrayTrait
{
/**
* toArray
*
* @return array
*/
public function toArray(): array
{
$zval = get_object_vars($this);
return($zval);
}
}
然后你猫做:
$myValue = $entity->toArray();