【问题标题】:Result of a find() query as an array of rows in Cakephp在 Cakephp 中作为行数组的 find() 查询的结果
【发布时间】:2012-08-30 00:53:17
【问题描述】:

我想做的事:

在 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);
    }

【问题讨论】:

  • cake 确实以行数组的形式返回结果。发布您需要的输出示例

标签: cakephp


【解决方案1】:

根据[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 了你的问题。
  • 仅供参考,从 2.2 开始,Set:: 已被弃用,取而代之的是 hash:: [book.cakephp.org/2.0/en/core-utility-libraries/hash.html]
【解决方案2】:

在您的 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);

【讨论】:

  • 您也可以使用array_map() method with the callback to implode method。参考链接:stackoverflow.com/questions/5259947/…
  • 我认为这属于 OP 已经建议并正在寻找替代方法的“处理返回的数组以满足我的需要”。
  • 当然。我还阅读了实际问题:“是否有更简单的解决方案来获得标准格式的解决方案:包含行的数组?” “更简单”的意思是比他给出的例子更简单。你所做的只是用一个复杂的循环来回答——他显然已经知道该怎么做了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
相关资源
最近更新 更多