2017-01-10 121 views
0

我只是使用cakePhp的函数query()。该查询将返回数组是这样的:如何使用两个键合并多维数组cakephp

array(
    (int) 0 => array(
     'cate' => array(
      'date' => '2016-12-05', 
     ), 
     'cate_detail' => array(
      'rel_data_category' => '11' 
     ), 
     'cate_item' => array(
      'price' => '150.000' 
     ), 
     'item' => array(
      'code' => '1' 
     ) 
    ), 
    (int) 1 => array(
     'cate' => array(
      'date' => '2016-12-05', 
     ), 
     'cate_detail' => array(
      'rel_data_category' => '10' 
     ), 
     'cate_item' => array(
      'price' => '250.000' 
     ), 
     'item' => array(
      'code' => '1' 
     ) 
    ), 
    (int) 2 => array(
     'cate' => array(
      'date' => '2016-12-06', 
     ), 
     'cate_detail' => array(
      'rel_data_category' => '10' 
     ), 
     'cate_item' => array(
      'price' => '250.000' 
     ), 
     'item' => array(
      'code' => '2' 
     ) 
    ), 
    (int) 3 => array(
     'cate' => array(
      'date' => '2016-12-06', 
     ), 
     'cate_detail' => array(
      'rel_data_category' => '10' 
     ), 
     'cate_item' => array(
      'price' => '250.000' 
     ), 
     'item' => array(
      'code' => '1' 
     ) 
    ) 
) 

现在,我要检查,如果数组具有相同的cate.dateitem.code将合并阵列(在这种情况下我的数组的元素0,1)。输出类似于:

array(
    (int) 0 => array(
     'cate' => array(
      'date' => '2016-12-05', 
     ), 
     'cate_detail' => array(
      (int) 0 => array (
       'rel_data_category' => '11', 
       'price' => '150.000' 
      ), 
      (int) 1 => array(
       'rel_data_category' => '10', 
       'price' => '250.000' 
      ) 
     ), 
     'item' => array(
      'code' => '1' 
     ) 
    ), 
    (int) 1 => array(
     'cate' => array(
      'date' => '2016-12-06', 
     ), 
     'cate_detail' => array(
      (int) 0 => array (
       'rel_data_category' => '10' 
       'price' => '250.000' 
      ) 
     ), 
     'item' => array(
      'code' => '2' 
     ) 
    ), 
    (int) 2 => array(
     'cate' => array(
      'date' => '2016-12-06', 
     ), 
     'cate_detail' => array(
      (int) 0 => array (
       'rel_data_category' => '10' 
       'price' => '250.000' 
      ) 
     ), 
     'item' => array(
      'code' => '1' 
     ) 
    ) 
) 

请帮忙!

+0

你不使用CakePHP查询构建器为这个? – Beginner

+0

是的,我只是使用'$ result = $ this-> query($ query);' –

+0

你可以提供你正在使用的完整查询,因为你想要的数组可以通过查询本身使用'hasmany'完成 –

回答

1

要做到这一点

首先声明这以后你会存储新的合并数组数据

$filter_data = array(); 

一个变量,然后循环现有的阵列

foreach($items as $item) { 

    // do somethind 

然后创建该检查功能物品相同datecode尚未存在于新阵列中

// checker 
    if (!checkExist($item['cate']['date'], $item['item']['code'])) { 

创建临时数据的变量,将追加到新阵列后

$data = array(
     'cate' => $item['cate'], 
     'item' => $item['item'] 
    ); 

然后重新创建循环,这将追加所有索引项cate_detailcate_item谁具有相同的 datecode从父环

} 
} 

所以,你的代码会是这样

$items = array(
    (int) 0 => array(
     'cate' => array(
      'date' => '2016-12-05', 
     ), 
     'cate_detail' => array(
      'rel_data_category' => '11' 
     ), 
     'cate_item' => array(
      'price' => '150.000' 
     ), 
     'item' => array(
      'code' => '1' 
     ) 
    ), 
    (int) 1 => array(
     'cate' => array(
      'date' => '2016-12-05', 
     ), 
     'cate_detail' => array(
      'rel_data_category' => '10' 
     ), 
     'cate_item' => array(
      'price' => '250.000' 
     ), 
     'item' => array(
      'code' => '1' 
     ) 
    ), 
    (int) 2 => array(
     'cate' => array(
      'date' => '2016-12-06', 
     ), 
     'cate_detail' => array(
      'rel_data_category' => '10' 
     ), 
     'cate_item' => array(
      'price' => '250.000' 
     ), 
     'item' => array(
      'code' => '2' 
     ) 
    ), 
    (int) 3 => array(
     'cate' => array(
      'date' => '2016-12-06', 
     ), 
     'cate_detail' => array(
      'rel_data_category' => '10' 
     ), 
     'cate_item' => array(
      'price' => '250.000' 
     ), 
     'item' => array(
      'code' => '1' 
     ) 
    ) 
); 

$filter_data = array(); 

foreach($items as $item) { 
    if (!checkExist($item['cate']['date'], $item['item']['code'])) { 
    $data = array(
     'cate' => $item['cate'], 
     'item' => $item['item'] 
    ); 
    foreach($items as $detail) { 
     if ($detail['cate']['date'] == $item['cate']['date'] && 
      $detail['item']['code'] == $item['item']['code']) { 
     $data['cate_detail'][] = array(
      'rel_data_category' => $detail['cate_detail']['rel_data_category'], 
      'price' => $detail['cate_item']['price'] 
     ); 
     } 
    } 
    $filter_data[] = $data; 
    } 
} 

function checkExist($date, $code){ 
    global $filter_data; 
    foreach($filter_data as $data) { 
    if ($data['cate']['date'] == $date && 
     $data['item']['code'] == $code) { 
     return true; 
    } 
    } 
    return false; 
} 

pr($filter_data); 

Demo

OR

$items = array(
    (int) 0 => array(
     'cate' => array(
      'date' => '2016-12-05', 
     ), 
     'cate_detail' => array(
      'rel_data_category' => '11' 
     ), 
     'cate_item' => array(
      'price' => '150.000' 
     ), 
     'item' => array(
      'code' => '1' 
     ) 
    ), 
    (int) 1 => array(
     'cate' => array(
      'date' => '2016-12-05', 
     ), 
     'cate_detail' => array(
      'rel_data_category' => '10' 
     ), 
     'cate_item' => array(
      'price' => '250.000' 
     ), 
     'item' => array(
      'code' => '1' 
     ) 
    ), 
    (int) 2 => array(
     'cate' => array(
      'date' => '2016-12-06', 
     ), 
     'cate_detail' => array(
      'rel_data_category' => '10' 
     ), 
     'cate_item' => array(
      'price' => '250.000' 
     ), 
     'item' => array(
      'code' => '2' 
     ) 
    ), 
    (int) 3 => array(
     'cate' => array(
      'date' => '2016-12-06', 
     ), 
     'cate_detail' => array(
      'rel_data_category' => '10' 
     ), 
     'cate_item' => array(
      'price' => '250.000' 
     ), 
     'item' => array(
      'code' => '1' 
     ) 
    ) 
); 

$filter_data = array(); 
$exists = array(); 

foreach($items as $item) { 
    $index_key = $item['cate']['date'].'-'.$item['item']['code']; 
    if (!isset($exists[$index_key])) { 
     $exists[$index_key] = 1; 
     $data = array(
      'cate' => $item['cate'], 
      'item' => $item['item'], 
      'cate_detail' => getItems($item['cate']['date'], $item['item']['code']) 
     ); 
     $filter_data[] = $data; 
    } 
} 

function getItems($date, $code) { 
    global $items; 
    $data = array(); 
    foreach($items as $detail) { 
     if ($detail['cate']['date'] == $date && $detail['item']['code'] == $code) { 
      $data[] = array(
      'rel_data_category' => $detail['cate_detail']['rel_data_category'], 
      'price' => $detail['cate_item']['price'] 
     ); 
     } 
    } 
    return $data; 
} 

pr($filter_data); 

Demo

+0

感谢帮帮我。这很有帮助! –