2017-06-19 109 views
0

我有一個元素的集合,我想在將它們放入一個數組中以發送我的迴應之前進行分組。我的循環如下所示:foreach循環的優化

$pages = $section->getPages(); 
$page_traduction_array = array(); 
$page_id = null; 
foreach ($pages as $page){ 
    if($page_id != $page->getId() && !is_null($page_id)) { 
     $page_dto = PageTraductionsDto::create($page_traduction_array); 
     array_push($this->pages, $page_dto); 
     $page_traduction_array = array(); 
    } 
    array_push($page_traduction_array, $page); 
    $page_id = $page->getId(); 
} 
$page_dto = PageTraductionsDto::create($page_traduction_array); 
array_push($this->pages, $page_dto); 

爲了更好地理解,每一頁有通過ID和語言ID所形成的複合主鍵,這樣我就可以追溯每一個翻譯爲每個頁面。

我想知道是否有什麼我可以做的,以擺脫循環後的兩條指令。有沒有一種方法可以在數組內完成?

非常感謝!

回答

0

我不用擔心最後兩行,當嘗試使用該方法對數據進行分組時,這是一個常見問題。

的另一種方法將是重新組的數據...

<?php 
error_reporting (E_ALL); 
ini_set ('display_errors', 1); 

class Page { 
    public $id; 
    public $data; 
    public function __construct($id, $data) { 
     $this->id = $id; 
     $this->data = $data; 
    } 

    public function getId() { 
     return $this->id; 
    } 
} 

$pages = [new Page(1,1), new Page(1,2), new Page(2,1) ]; 

$result = []; 
foreach ($pages as $page) { 
    $result[$page->getId()][] = $page; 
} 

print_r($result); 

此代碼的核心是在foreach,其給出的結果...

Array 
(
    [1] => Array 
     (
      [0] => Page Object 
       (
        [id] => 1 
        [data] => 1 
       ) 

      [1] => Page Object 
       (
        [id] => 1 
        [data] => 2 
       ) 

     ) 

    [2] => Array 
     (
      [0] => Page Object 
       (
        [id] => 2 
        [data] => 1 
       ) 

     ) 

) 

您然後可以在$ result上獲得foreach,這將爲您提供每個ID的所有頁面的列表。