2

我在下面得到了这段代码,它工作得很好。我一直在分析它,并且这段代码被使用了很多次,所以我想尝试弄清楚如何以一种比当前编写方式更好的方式编写它。

有没有更有效的方法来写这个?

function objectToArray($d) {
    if (is_object($d)) {
        // Gets the properties of the given object
        // with get_object_vars function
        $d = get_object_vars($d);
    }

    if (is_array($d)) {
        // Return array converted to object Using __FUNCTION__ (Magic constant) for recursive call
        return array_map(__FUNCTION__, $d);
    }
    else {
        // Return array
        return $d;
    }
}
4

5 回答 5

1

您可以toArray()为需要转换的类实现一个方法:

例如

class foo
{
  protected $property1;
  protected $property2;

  public function __toArray()
  {
    return array(
      'property1' => $this->property1,
      'property2' => $this->property2
    );
  }
 }

在我看来,访问受保护的属性并将整个转换封装在类中是最好的方法。

更新

需要注意的一件事是,该get_object_vars()函数只会返回可公开访问的属性 - 可能不是您所追求的。

如果上面的任务过于手动,那么来自类外的准确方法是使用内置的 PHP (SPL) ReflectionClass

$values = array();
$reflectionClass = new \ReflectionClass($object);
foreach($reflectionClass->getProperties() as $property) {
  $values[$property->getName()] = $property->getValue($object); 
}
var_dump($values);
于 2013-09-23T22:12:52.927 回答
0

取决于它是什么类型的对象,许多标准的 php 对象都有内置的方法来转换它们

例如 MySQLi 结果可以这样转换

$resultArray = $result->fetch_array(MYSQLI_ASSOC);

如果它是一个自定义类对象,您可能会考虑在该类中实现一个方法,如 AlexP 所建议的那样

于 2013-09-23T22:20:39.330 回答
0

结束了:

function objectToArray($d) {
$d = (object) $d;
return $d;
}
function arrayToObject($d) {
$d = (array) $d;
return $d;
}
于 2013-09-23T23:06:42.133 回答
0

正如 AlexP 所说,您可以实现一个方法 __toArray()。替代 ReflexionClass (复杂且昂贵),利用对象迭代属性,您可以迭代$this如下

class Foo
{
  protected $var1;
  protected $var2;

  public function __toArray()
  {
    $result = array();
    foreach ($this as $key => $value) {
      $result[$key] = $value;
    }
    return $result;
  }
}

这也将迭代类中未定义的对象属性:例如

$foo = new Foo;
$foo->var3 = 'asdf';
var_dump($foo->__toArray());)

参见示例http://3v4l.org/OnVkf

于 2013-09-23T23:16:27.003 回答
0

这是我发现将对象转换为数组的最快方法。也适用于胶囊。

     function objectToArray ($object) {
        return json_decode(json_encode($object, JSON_FORCE_OBJECT), true);
    }
于 2021-08-25T02:38:18.443 回答