2

私がやろうとしていること:

行の配列として Cakephp で find() クエリの結果を取得する

どうして?:

結果をExcelに送りたいので、通常のcakePHPのフォーマットは自分には合いません。

私が知っている解決策:

考えられる解決策は 2 つあります。

  • カスタム 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));

解決策: (ありがとうデイブ):

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

2 に答える 2

2

[こちら]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);

私はそれをテストしていませんが、ここで非常によく似た問題に対する受け入れられた答えです:文字列から数値プレフィックスを削除します - PHP regex

于 2012-08-29T14:12:07.373 に答える
-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);
于 2012-08-29T13:43:10.067 に答える