0

I just using function query() of cakePhp. The query will return array something like :

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'
        )
    )
)

Now, I want to check if array have the same cate.date and item.code will merge array (in this case is elements 0,1 of my array). Output something like :

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'
        )
    )
)

Please help!

3
  • you're not using cakephp query builder for this? Commented Jan 10, 2017 at 3:36
  • Yep, I just using $result = $this->query($query); Commented Jan 10, 2017 at 4:33
  • Can you provide the full query you are using because the array you want can be done by the query itself using hasmany Commented Jan 10, 2017 at 5:09

1 Answer 1

1

To do that

First declare a variable which later you will store new merge array data

$filter_data = array();

then loop your existing array

foreach($items as $item) {

    // do somethind

then create a function which check if item which same date and code not yet exist in the new array

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

Create a variable for temporary data that will append to the new array later

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

Then create loop again which will append all index item cate_detail and cate_item who have the same date and code from the parent loop

   }
}

So your code would be like this

$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

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for help. It's helpful!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.