find()查询的结果,作为Cakephp中的行数组

时间:2012-08-29 13:12:12

标签: cakephp

我正在尝试做什么:

在Cakephp中获取find()查询的结果作为行数组

为什么:吗

我想将结果发送到Excel,因此常规的cakePHP格式不适合我。

我知道的解决方案:

我看到两种可能的解决方案:

  • 自定义SQL查询
  • 处理返回的数组以满足我的需要

我的问题:

是否有一个更简单的解决方案来获得标准格式的解决方案:带行的数组?

修改

cakephp返回如下数组:

$data=array("0"=>array("ModelName"=>array(Model.field1,Model.field2),
                       "LinkedModelName"=>array(LinkedModel.field1,LinkedModel.field2)

)

我想:

$data=array("0"=>array(Model.field1,Model.field2,LinkedModel.field1,LinkedModel.field2));

解决方案:(请问Dave):

    foreach($data as &$row){
    $row = Set::flatten($row);
    }

2 个答案:

答案 0 :(得分:2)

根据书籍[here],您可以使用Set::flatten($data);“将多维数组折叠到单个维度中”。

这是一个例子:

<?php
$arr = array(
    array(
        'Post' => array('id' => '1', 'title' => 'First Post'),
        'Author' => array('id' => '1', 'user' => 'Kyle'),
    ),
    array(
        'Post' => array('id' => '2', 'title' => 'Second Post'),
        'Author' => array('id' => '3', 'user' => 'Crystal'),
    ),
);
$res = Set::flatten($arr);
/* $res now looks like:
    Array (
        [0.Post.id] => 1
        [0.Post.title] => First Post
        [0.Author.id] => 1
        [0.Author.user] => Kyle
        [1.Post.id] => 2
        [1.Post.title] => Second Post
        [1.Author.id] => 3
        [1.Author.user] => Crystal
    )
*/

从那里(如果需要),删除字段上的#.前缀应该非常简单。

可能是这样的事情:

preg_replace('/^[0-9]+\.+/', '', $string);

我还没有对它进行过测试,但这是一个非常类似问题的公认答案:Remove numeric prefix from string - PHP regex

答案 1 :(得分:-1)

在App Controller文件中定义以下方法:

//flattens a multi-dimensional array (recursive implode)
function r_implode( $glue, $pieces )
{
    foreach( $pieces as $r_pieces )
    {
        if( is_array( $r_pieces ) )
        {
            $retVal[] = r_implode( $glue, $r_pieces );
        }
        else    
        {
            $retVal[] = $r_pieces;
        }
    }
    return implode( $glue, $retVal );
} 

只需将其调入您的代码:

 $data = $this->r_implode(',', $data);
 pr($data);

当你被问到需要破坏内部数组时,如:

$data=array("0"=>array(Model.field1,Model.field2,LinkedModel.field1,LinkedModel.field2));

然后你可以使用foreach循环来做到这一点:

foreach($data as $key => $indexed_array)
{
     $data[$key] = $this->r_implode(",", $indexed_array);
}
pr($data);