获取PHPActiveRecord结果作为简单数组,而不是对象数组

获取PHPActiveRecord结果作为简单数组,而不是对象数组,php,zend-framework,phpactiverecord,Php,Zend Framework,Phpactiverecord,我希望有一个简单的a方法,它可以将PHP Activerecord结果作为简单/关联数组返回,而不是作为Activerecord对象数组返回。 在Ruby中,我相信这可能是通过.map()方法实现的。(我不是红宝石人…) 我想要的是一个简单的方法调用,比如Zend_DB_表中的toArray(),而不是foreach,或者类似的东西,但我似乎在他们的表中找不到它 在PHP ActiveRecord中,获得结果非常简单: $settings = SystemSettings::all(); 但它

我希望有一个简单的a方法,它可以将PHP Activerecord结果作为简单/关联数组返回,而不是作为Activerecord对象数组返回。

在Ruby中,我相信这可能是通过
.map()
方法实现的。(我不是红宝石人…)

我想要的是一个简单的方法调用,比如Zend_DB_表中的
toArray()
,而不是foreach,或者类似的东西,但我似乎在他们的表中找不到它

在PHP ActiveRecord中,获得结果非常简单:

$settings = SystemSettings::all();
但它会回馈出这样的东西:

[0] => SystemSettings Object
    (
        [errors] => 
        [attributes:ActiveRecord\Model:private] => Array
            (
                [param] => author
                [value] => Hawle
            )

        [__dirty:ActiveRecord\Model:private] => Array
            (
            )

        [__readonly:ActiveRecord\Model:private] => 
        [__relationships:ActiveRecord\Model:private] => Array
            (
            )

        [__new_record:ActiveRecord\Model:private] => 
    )

[1] => SystemSettings Object
    (
        [errors] => 
        [attributes:ActiveRecord\Model:private] => Array
            (
                [param] => base_url
                [value] => example.com
            )

        [__dirty:ActiveRecord\Model:private] => Array
            (
            )

        [__readonly:ActiveRecord\Model:private] => 
        [__relationships:ActiveRecord\Model:private] => Array
            (
            )

        [__new_record:ActiveRecord\Model:private] => 
    )
Array
    (
        [author] => Hawle
        [base_url] => example.com
    )
虽然这在很多情况下都非常好,但在这里,我只希望有一个简单的数组,如下所示:

[0] => SystemSettings Object
    (
        [errors] => 
        [attributes:ActiveRecord\Model:private] => Array
            (
                [param] => author
                [value] => Hawle
            )

        [__dirty:ActiveRecord\Model:private] => Array
            (
            )

        [__readonly:ActiveRecord\Model:private] => 
        [__relationships:ActiveRecord\Model:private] => Array
            (
            )

        [__new_record:ActiveRecord\Model:private] => 
    )

[1] => SystemSettings Object
    (
        [errors] => 
        [attributes:ActiveRecord\Model:private] => Array
            (
                [param] => base_url
                [value] => example.com
            )

        [__dirty:ActiveRecord\Model:private] => Array
            (
            )

        [__readonly:ActiveRecord\Model:private] => 
        [__relationships:ActiveRecord\Model:private] => Array
            (
            )

        [__new_record:ActiveRecord\Model:private] => 
    )
Array
    (
        [author] => Hawle
        [base_url] => example.com
    )

你可以这样做:

funciton ar2array($settings){
   $arr = array();
   foreach($settings as $fieldObj){
      $fieldName = $fieldObj->attributes["param"];
      $fieldValue = $fieldObj->attributes["value"];
      $arr[$fieldName] = $fieldValue;
   }
   return $arr;
}
$resultAsYouWant = ar2array($settings);
希望这有帮助。干杯


PS:如果
->attributes
是私有的,请使用它的accesor方法(必须有一个)作为
->getAttributes()
或等效方法。

我也有类似的问题,希望这能帮助其他偶然发现它的人。显然,这是phpactiverecord.org特有的

class MyPHPActiveRecord extends PHPActiveRecord {

    public function toJSON() {
        return json_encode(get_object_vars($this));
    }
}
在/lib/Model.php中,我添加了以下函数:

public function to_array(array $options=array())
{
    return $this->serialize('array', $options);
}
在/lib/Serialization.php中,我添加了以下类

class arraySerializer extends Serialization
{
    public static $include_root = false;

    public function to_s()
    {
        return self::$include_root ? array(strtolower(get_class($this->model)) => $this->to_a()) : $this->to_a();
    }


}
然后我可以调用->到_array()并获取一个数组


希望这有帮助

我发现这是为了解决我在使用Yii框架时遇到的同一个问题——在Yii中有更简单的方法来实现这一点

$posts = Posts::model()->findAll();

foreach($posts as $result)
{
    print_r($result->attributes);
}
它按要求打印简单数组:

Array
(
    [id] => 1
    [title] => Title
    [text] => Text
)

希望它能帮助一些人。

我一直在寻找这个问题的答案,以便生成一系列结果,这些结果可以轻松地进行json编码并作为对ajax调用的响应发送。我只想要结果数组中每个对象的属性

不幸的是,您不能只对每个结果调用_json(),然后对整个结果进行json编码;你最终得到了双重编码。幸运的是,@willwashburn发布的用于解决此问题的函数和类现在已经包含在php activerecord中,尽管它们似乎还没有包含在在线文档中

要返回结果数组,请执行以下操作:

$data = MyModel::find('all');
foreach ($data as &$result) {
    $result = $result->to_array();
}
现在,整个结果集将是一个数组数组,只包含每个对象的属性。然后你可以做类似的事情

echo(json_encode($data));
如果要将其作为对ajax调用的响应发送。

这是我的解决方案:

$posts = Post::find('all');

$arrayResult = array_map(function($res){
  return $res->attributes();
}, $posts);
printf('<pre>%s</pre>', print_r($arrayResult, true));
$posts=Post::find('all');
$arrayResult=数组映射(函数($res){
返回$res->attributes();
}美元员额);
printf(“%s”,print_r($arrayResult,true));
我的解决方案:

$posts = Post::find('all');

$arrayResult = array_map(function($res){
  return $res->attributes();
}, $posts);
printf('<pre>%s</pre>', print_r($arrayResult, true));
  • 将以下方法添加到lib\utils.php中的utils类

    echo \ActiveRecord\Utils::results_to_json($dataobject);
    
  • 电话:

     $r = Model::find('$id')->attributes();
     $a = [];
     foreach ($r as $k => $v)
     {
         $a[$k] = $v;
     }
    

  • 显然,这与OP无关;然而,考虑到我仍然花了一个多小时才找到解决方案(不感谢php activerecords文档),这可能会帮助其他人


    也许不是最优雅的,但效果很好。

    我也尝试过,但它不是真正的解决方案:$result=SystemSettings::all()$json_encoded=$result->to_json()$解码=json_解码($json_编码);如果您只需要数组,那么为什么首先要使用activerecord类呢?我希望在大多数情况下都使用activerecord类,但在这种特殊情况下,我只希望有一个简单的方法。我想知道是否已经有了一个类似于示例->to_json()序列化的方法。我可以为它编写自己的函数,但我想知道你们是否知道任何存在的方法,可能是未记录的,等等@dqhendricks-对不起,但我相信你们不理解我的问题。我不是在寻找一个PHP替代方法,而是一个phpactiverecord方法。->to_json就是这样的。Thanx,虽然在此期间我做了几乎相同的更改,但这是一个完美的解决方案!