2017-06-19 89 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的所有页面的列表。