2011-02-09 66 views
0

嗨,大家好,我有一些問題,並且讓我感到沮喪。我有一個CakePHP應用程序,我一直在努力,我似乎​​無法找到一種方式來顯示我想要的方式。導致重複行的兩個PHP foreaches

這是在我的控制器方法的代碼:

function index(){ 
    $this->Order->recursive = 2; 
    $orders = $this->Order->findAllByVendor_id($this->Auth->User('vendor_id')); 
    foreach($orders as $order){ 
     $item_ids = explode(',', $order['Order']['items']); 
     foreach($item_ids as $item_id){ 
      $products = $this->Product->findById($item_id); 
      $order_products[] = $products['Product']['product_name']; 
     } 
     $vendor_orders[] = $order_products; 
    } 
    $this->set('orders_products', $vendor_orders); 
    $this->set('orders', $this->paginate('Order', array('Order.vendor_id' => $this->Auth->User('vendor_id')))); 
} 

這是我的視圖代碼:

<div class="block" id="vendor-dash"> 
    <table cellpadding="0" cellspacing="0"> 
     <?php 
     $i = 0; 
     foreach($orders as $order){ 
      $class = null; 
      if ($i++ % 2 == 0) { 
       $class = ' class="altrow"'; 
      } 

      $pickup_time=date("H:i", strtotime($order['Order']['pickup_time'])); 
      $difference = strtotime('23:52') - date('H:i'); 
      // echo date("H:i", strtotime($difference)); 
      foreach($orders_products as $order_products){ 
     ?> 
     <tr<?php echo $class;?> id="<?php echo $order['Order']['id']; ?>"> 
      <td class="confirmation"><?php echo $order['Order']['confirmation']; ?></td> 
      <td class="products"> 
      <?php 
        foreach($order_products as $order_product){ 
         echo $order_product . ', '; 
        } 
      ?></td> 
      <td><a href="#" id="<?php echo $order['Order']['id']; ?>" class="action">Fulfill Order</a></td> 
     </tr> 
     <?php  
       } 
     } ?> 
</div> 

兩者的foreach($訂單爲$順序)和在foreach($ orders_products如$ order_products)持有多個訂單的信息。 $ orders包含訂單號,取件時間等,而$ orders_products是通過「爆炸」存儲在數據庫字段中的每個訂單的產品ID數組(在上面)創建的陣列數組(例如1, 2,3)。

但是,每當頁面出現時,由於每個訂單運行一次的兩個foreach循環,它會顯示每個訂單三次。所以我沒有三個訂單,每個訂單都有幾個項目,我最終看到了九個訂單。

任何想法?

+0

您是否看到每個訂單的「訂購產品」的預期數量?或者這些的倍數? – jpwco 2011-02-09 21:06:50

+0

是的。正確的訂單數量正在出現,每個訂單都顯示了三次(a,b,c,a,b,c,a,b,c),因爲我有兩個foreach循環。有什麼想法嗎? – user568636 2011-02-09 21:54:24

回答

1

它看起來就像在你index方法,你沒有循環回過$item_ids前設置$order_products爲空數組 - 嘗試這樣的事:

function index(){ 
    $this->Order->recursive = 2; 
    $orders = $this->Order->findAllByVendor_id($this->Auth->User('vendor_id')); 
    foreach($orders as $order){ 
     $order_products = array(); // Here is the reset to an empty array. 
     $item_ids = explode(',', $order['Order']['items']); 
     foreach($item_ids as $item_id){ 
      $products = $this->Product->findById($item_id); 
      $order_products[] = $products['Product']['product_name']; 
     } 
     $vendor_orders[] = $order_products; 
    } 
    $this->set('orders_products', $vendor_orders); 
    $this->set('orders', $this->paginate('Order', array('Order.vendor_id' => $this->Auth->User('vendor_id')))); 
} 
+0

你也可能想要在`Order`和`Product`之間創建一個`HABTM`,這樣你就不必做那個逗號分隔的列表。 – joeb 2011-02-09 22:00:54

0

陣列過度生長。在控制器中,$ order_products數組隨着每個循環而增長。

所以,重置陣列內foreach ($orders as $order)

foreach($orders as $order){ 
    $item_ids = explode(',', $order['Order']['items']); 

    $order_products = array(); // <-- RESET ARRAY 

    foreach($item_ids as $item_id){ 
     $products = $this->Product->findById($item_id); 
     $order_products[] = $products['Product']['product_name']; 
    } 
    $vendor_orders[] = $order_products; 
} 

和,東西看上去視圖奇...之後

//echo date("H:i", strtotime($difference)); 
    foreach($orders_products as $order_products){ // <-- EXTRA. comment it out and it's } 

無論其檢查

...額外的foreach循環,我仍然沒有看到你如何以正確的順序獲得正確的產品。