0

The original array is:

 array (
 0 => 
  array (
  'order_id' => '5870',
  'email' => 'fak*****mid@gmail.com',
  'item' => 'carrier',
  'IMEI' => '353337073126392',
 ),
 1 =>
  array (
    'order_id' => '5877',
    'email' => 'asl***mid@gmail.com',
    'item' => 'network',
    'IMEI' => '354447064267144',
  ),
  2 => 
  array (
    'order_id' => '5878',
    'email' => 'pab***mid@gmail.com',
    'item' => 'O2 UK',
    'IMEI' => '35495207085492',
  ),
  3 => 
  array (
    'order_id' => '5879',
    'email' => 'persi****dia@yahoo.com',
    'item' => 'carrier',
    'IMEI' => '353337073126392',
  ),
  4 => 
  array (
    'order_id' => '5882',
    'email' => 'di***r18@gmail.com',
    'item' => 'blacklist check',
    'IMEI' => '354407067239243',
  ),
  5 => 
  array (
    'order_id' => '5884',
    'email' => 'm***matin@gmail.com',
    'item' => 'Vodafone',
    'IMEI' => '353337073126392',
  ),
)

As you can see, array #0, #3, #5 have the same IMEI number. my question is that how can I group my array based on the same IMEI values. I'd like to derive three different arrays out of the original array. something like:

ArrayA
1 => 
  array (
    'order_id' => '5877',
    'email' => 'asl***mid@gmail.com',
    'item' => 'network',
    'IMEI' => '354447064267144',
  ),
  2 => 
  array (
    'order_id' => '5878',
    'email' => 'pab***mid@gmail.com',
    'item' => 'O2 UK',
    'IMEI' => '35495207085492',
  ),
  4 => 
  array (
    'order_id' => '5882',
    'email' => 'di****18@gmail.com',
    'item' => 'blacklist check',
    'IMEI' => '354407067239243',
  ),
)

Now, array #0, #3, #5 have the same IMEI numbers but array #0, #3 have the same item names as well. so ArrayB would be something like:

ArrayB
0 => 
  array (
    'order_id' => '5870',
    'email' => 'fak*****mid@gmail.com',
    'item' => 'carrier',
    'IMEI' => '353337073126392',
  ),
3 => 
  array (
    'order_id' => '5879',
    'email' => 'persi****dia@yahoo.com',
    'item' => 'carrier',
    'IMEI' => '353337073126392',
  ),
)

And finally ArrayC is gonna be something like:

ArrayC
5 => 
  array (
    'order_id' => '5884',
    'email' => 'mo****tin@gmail.com',
    'item' => 'Vodafone',
    'IMEI' => '353337073126392',
  ),
)

I know I can use a FOR loop and check the IMEI values but just in case something cleaner way is out there which I don't know about?

PersianHero
  • 87
  • 2
  • 10
  • It sounds to me as though you're looking for something like [this](http://stackoverflow.com/questions/7574857/group-array-by-subarray-values). – Obsidian Age May 07 '17 at 23:58
  • @PersianHero you must provide your latest/best attempt to self-solve this question -- this proves that you are not just seeking a free coding service. – mickmackusa May 16 '17 at 14:31

3 Answers3

0

i'm not sure this is the best solution but it's work try this code

$a = [
 [
    'order_id' => '5870',
    'email' => 'fak*****mid@gmail.com',
    'item' => 'carrier',
    'IMEI' => '353337073126392',
 ],[
    'order_id' => '5877',
    'email' => 'asl***mid@gmail.com',
    'item' => 'network',
    'IMEI' => '354447064267144',
  ],[
    'order_id' => '5878',
    'email' => 'pab***mid@gmail.com',
    'item' => 'O2 UK',
    'IMEI' => '35495207085492',
  ],[
    'order_id' => '5879',
    'email' => 'persi****dia@yahoo.com',
    'item' => 'carrier',
    'IMEI' => '353337073126392',
  ],[
    'order_id' => '5882',
    'email' => 'di***r18@gmail.com',
    'item' => 'blacklist check',
    'IMEI' => '354407067239243',
  ],[
    'order_id' => '5884',
    'email' => 'm***matin@gmail.com',
    'item' => 'Vodafone',
    'IMEI' => '353337073126392',
  ],
];


function groupData($datas, $firstKey, $secondKey)
{
    //Define output
    $firstGroup  = [];
    $secondGroup = [];
    $thirdGroup  = [];

    $tmps = [];
    $tmpIds = [];

    //check first key
    foreach ($datas as $data) {
        if (!isset($firstGroup[$data[$firstKey]])) {
            if (!in_array($data[$firstKey], $tmpIds)  ) {
                $firstGroup[$data[$firstKey]] = $data;
                $tmpIds[] = $data[$firstKey];
            } else {
                $tmps[] = $data;
            }
        } else {
            $old = $firstGroup[$data[$firstKey]];
            //remove from first and add to tmps
            unset($firstGroup[$data[$firstKey]]);
            $tmps[] = $old;
            $tmps[] = $data;

        }
    }
    //check tmps key
    foreach ($tmps as $each) {
        if (!isset($thirdGroup[$each[$firstKey].$each[$secondKey]])) {
            $thirdGroup[$each[$firstKey].$each[$secondKey]] = $each;
        } else {
            $old = $thirdGroup[$each[$firstKey].$each[$secondKey]];
            $secondGroup[uniqid()] = $old;

            //remove from first and add to second
            unset($thirdGroup[$each[$firstKey].$each[$secondKey]]);
            $secondGroup[uniqid()] = $each;
        }
    }

    return [
        'first'  => $firstGroup, 
        'second' => $secondGroup, 
        'third'  => $thirdGroup
    ];
} 

$res = groupData($a, 'IMEI', 'item');

print_r(array_values($res['first']));
print_r(array_values($res['second']));
print_r(array_values($res['third']));

Hope this help

0

You can use array_reduce:

$result = array_reduce($array, function ($result, $item) {
    if (!isset($result[$item['IMEI']][$item['item']])) {
        $result[$item['IMEI']][$item['item']] = [];
    }

    $result[$item['IMEI']][$item['item']][] = $item;
    return $result;
}, []);

Here is working demo.

sevavietl
  • 3,762
  • 1
  • 14
  • 21
0

This solution is compliant with php5.2 and just as clean syntactically as I would write it in php7.

Use each subarray's IMEI value as a temporary key in your result array and keep pushing new data into the result array as you iterate.

Code: (Demo)

$array = array(
  array('order_id' => '5870', 'email' => 'fak*****mid@gmail.com', 'item' => 'carrier', 'IMEI' => '353337073126392'),
  array('order_id' => '5877', 'email' => 'asl***mid@gmail.com', 'item' => 'network', 'IMEI' => '354447064267144'),
  array('order_id' => '5878', 'email' => 'pab***mid@gmail.com', 'item' => 'O2 UK', 'IMEI' => '35495207085492'),
  array('order_id' => '5879', 'email' => 'persi****dia@yahoo.com', 'item' => 'carrier', 'IMEI' => '353337073126392'),
  array('order_id' => '5882', 'email' => 'di***r18@gmail.com', 'item' => 'blacklist check', 'IMEI' => '354407067239243'),
  array('order_id' => '5884', 'email' => 'm***matin@gmail.com', 'item' => 'Vodafone', 'IMEI' => '353337073126392')
);

foreach ($array as $row) {
    $result[$row['IMEI']][] = $row;
}

var_export(array_values($result));

Output:

array (
  0 => 
  array (
    0 => 
    array (
      'order_id' => '5870',
      'email' => 'fak*****mid@gmail.com',
      'item' => 'carrier',
      'IMEI' => '353337073126392',
    ),
    1 => 
    array (
      'order_id' => '5879',
      'email' => 'persi****dia@yahoo.com',
      'item' => 'carrier',
      'IMEI' => '353337073126392',
    ),
    2 => 
    array (
      'order_id' => '5884',
      'email' => 'm***matin@gmail.com',
      'item' => 'Vodafone',
      'IMEI' => '353337073126392',
    ),
  ),
  1 => 
  array (
    0 => 
    array (
      'order_id' => '5877',
      'email' => 'asl***mid@gmail.com',
      'item' => 'network',
      'IMEI' => '354447064267144',
    ),
  ),
  2 => 
  array (
    0 => 
    array (
      'order_id' => '5878',
      'email' => 'pab***mid@gmail.com',
      'item' => 'O2 UK',
      'IMEI' => '35495207085492',
    ),
  ),
  3 => 
  array (
    0 => 
    array (
      'order_id' => '5882',
      'email' => 'di***r18@gmail.com',
      'item' => 'blacklist check',
      'IMEI' => '354407067239243',
    ),
  ),
)
mickmackusa
  • 43,625
  • 12
  • 83
  • 136