2012-06-20 3 views
2

У меня есть такие массивы.Группировка многомерного массива двумя значениями

[11] => Array 
    (
     [transactioncurrencyid] => Array 
      (
       [!name] => US Dollar 
       [!] => {041E3DC9-D938-DD11-982C-0013724C58B7} 
      ) 

     [smi_processingmonth] => Array 
      (
       [!date] => 6/1/2011 
       [!time] => 2:27 PM 
       [!] => 2011-06-01T14:27:00-07:00 
      ) 

     [smi_cchistoryid] => {678C5036-9EAA-E111-88E0-00155D010302} 
     [smi_includeindeal] => Array 
      (
       [!name] => No 
       [!] => 0 
      ) 

        [smi_locationid] => Array 
      (
       [!name] => 1134 Hooksett Rd 
       [!] => {5CC1585B-91AA-E111-88E0-00155D010302} 
      ) 
    ) 

[12] => Array 
    (
     [transactioncurrencyid] => Array 
      (
       [!name] => US Dollar 
       [!] => {041E3DC9-D938-DD11-982C-0013724C58B7} 
      ) 


     [smi_processingmonth] => Array 
      (
       [!date] => 5/1/2011 
       [!time] => 2:27 PM 
       [!] => 2011-05-01T14:27:00-07:00 
      ) 

     [smi_cchistoryid] => {688C5036-9EAA-E111-88E0-00155D010302} 
     [smi_includeindeal] => Array 
      (
       [!name] => No 
       [!] => 0 
      ) 

     [smi_locationid] => Array 
      (
       [!name] => 1134 Hooksett Rd 
       [!] => {5CC1585B-91AA-E111-88E0-00155D010302} 
      ) 
    ) 

Как я группировать их по местоположению ид затем smi_processingmonth

Так я получаю что-то вроде этого

[1134 Hooksett Rd] => Array 
    (
     [ 5/1/2011] = array(
      [transactioncurrencyid] => Array 
      (
       [!name] => US Dollar 
       [!] => {041E3DC9-D938-DD11-982C-0013724C58B7} 
      ) 


      [smi_processingmonth] => Array 
       (
        [!date] => 5/1/2011 
        [!time] => 2:27 PM 
        [!] => 2011-05-01T14:27:00-07:00 
       ) 

      [smi_cchistoryid] => {688C5036-9EAA-E111-88E0-00155D010302} 
      [smi_includeindeal] => Array 
       (
        [!name] => No 
        [!] => 0 
       ) 

      [smi_locationid] => Array 
       (
        [!name] => 1134 Hooksett Rd 
        [!] => {5CC1585B-91AA-E111-88E0-00155D010302} 

      ) 
      ) 
     [1/1/2011] = array(
      [transactioncurrencyid] => Array 
      (
       [!name] => US Dollar 
       [!] => {041E3DC9-D938-DD11-982C-0013724C58B7} 
      ) 

     [smi_processingmonth] => Array 
      (
       [!date] => 6/1/2011 
       [!time] => 2:27 PM 
       [!] => 2011-06-01T14:27:00-07:00 
      ) 

     [smi_cchistoryid] => {678C5036-9EAA-E111-88E0-00155D010302} 
     [smi_includeindeal] => Array 
      (
       [!name] => No 
       [!] => 0 
      ) 

        [smi_locationid] => Array 
      (
       [!name] => 1134 Hooksett Rd 
       [!] => {5CC1585B-91AA-E111-88E0-00155D010302} 
      ) 
      ) 
    ) 

Я попытался

foreach($array as $keys) 
       { 

        $key = $keys['smi_processingmonth']['!date'];; 
        if (!isset($groups[$key])) 
        { 
         $groups[$key] = array($keys); 
        } else { 
         $groups[$key][] = $keys; 
        } 
       } 
       $newGroups = array(); 

       if(is_array($groups)) 
       { 
        foreach($groups as $cats => $values) 
        { 

         foreach($values as $itemValues){ 
          $st = rtrim(trim($itemValues['smi_locationid']['!'])); 
           $key = $st; 
           if (!isset($newGroups[$key])) 
           { 
            $newGroups[$key] = array($groups); 

           } else { 
            $newGroups[$key][] = $itemValues; 
           } 
          } 
         } 
        } 

Спасибо!

ответ

3

Принимая от Johan с некоторыми изменениями:

  • избежать LTrim если уже используется отделка
  • положить в функции, я могу использовать временные переменные, чтобы сохранить читаемость
  • добавить последний [] , чтобы избежать столкновений неприятных $/имени $ даты, из первоначального запроса, но безопаснее
function compactArray($data) 
{ 
    $new_structure = array(); 
    foreach ($data as $row) 
     { 
     $name = trim($row['smi_locationid']['!name']); 
     $date = trim($row['smi_processingmonth']['!date']); 
     $new_structure[ $name ][ $date ][] = $row; 
    } 
    return $new_structure; 
} 
1

Ehm, я не тестировал его. Но это не так просто:

$new_structure = array(); 
foreach ($data as $row) { 
    $key1 = rtrim(trim($row['smi_locationid']['!name'])); 
    $key2 = rtrim(trim($row['smi_processingmonth']['!date'])); 
    $new_structure[$key1][$key2] = $row; 
} 

Этот код может использовать некоторые Исеть() с, но я решил оставить их для ясности.

0

Следующая производит нужный выходной массив, правильно отсортированный:

function transaction_datecmp($tran1, $tran2) 
{ 
    return strtotime($tran1['smi_processingmonth']['!']) - 
      strtotime($tran2['smi_processingmonth']['!']); 
} 

$output_arr = array(); 
foreach ($input_arr as $transaction) { 
    $location = $transaction['smi_locationid']  ['!name']; 
    $date  = $transaction['smi_processingmonth']['!date']; 
    $output_arr[$location][$date] = $transaction; 
} 
ksort($output_arr); // sorts by location 
foreach ($output_arr as &$transaction_arr) { 
    uasort($transaction_arr, 'transaction_datecmp'); 
} 

Ваша структура данных основывается на предположении, что не может быть две сделки в тот же день, что несколько опасное предположение. Также использование местоположения в качестве ключа далеко не идеально (из-за орфографии, изменения местоположения и т. Д.) - если это действительно не должно группировать вещи, например, для рассылки бумаги.

Очистка данных, например, trimm строк, следует делать заранее, в идеале на время ввода данных.

Смежные вопросы