2012-08-29 47 views
2

我想要做的事:結果一個發現()查詢作爲行CakePHP中數組的

獲得在CakePHP中發現()查詢的結果爲行數組

爲什麼?:

我想發送結果到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)); 

解決方案:(THKS戴夫):

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

cake * does *將結果作爲行數組返回。發佈您需要輸出的示例 – Ross

+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

+0

不錯。現在我只需要將每一行弄平。正是我在找什麼! –

+0

很高興幫助。它也幫助我學習 - 直到你的問題讓我搜索它,我才意識到這是存在的,所以......謝謝:) + 1你的問題。 – Dave

+1

僅供參考,截至2.2 Set ::已被棄用,以支持hash :: [http://book.cakephp.org/2.0/en/core-utility-libraries/hash.html] –

-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); 
+1

您也可以使用'array_map()方法與回調implode方法'。參考鏈接:http://stackoverflow.com/questions/5259947/php-implode-multidimensional-array-to-tab-dilimited-lines –

+0

我認爲這屬於「治療返回的數組,以適應我的需要」的OP已經建議並正在尋找替代方法。 – Dave

+0

當然。我還閱讀了** _實際問題_ **:「是否有更簡單的解決方案以標準格式獲得解決方案:包含行的數組?」 「簡單」比他給出的例子更簡單。你所做的只是一個複雜的循環 - 他顯然已經知道該怎麼做。 – Dave