2013-09-25 4 views
-2

Я пытаюсь получить требуемый вывод из массива. Я получаю массив данных из для цикла, как это:Объединение элементов массива в PHP

Array 
(
[TIMESLOTID] => 27 
[DATE] => za 05-04-2014 15:00 
[ProductID] => 196 
[VariantID] => 1079 
) 
Array 
(
[TIMESLOTID] => 27 
[DATE] => za 12-04-2014 15:00 
[ProductID] => 196 
[VariantID] => 1079 
) 
Array 
(
[TIMESLOTID] => 27 
[DATE] => za 29-03-2014 15:00 
[ProductID] => 196 
[VariantID] => 1079 
) 
Array 
(
[TIMESLOTID] => 23 
[DATE] => ma 07-04-2014 10:00 
[ProductID] => 196 
[VariantID] => 1083 
) 

Теперь Если значения [TIMESLOTID], [ProductID] и [VariantID] совпадают, они должны быть объединены в один массив в противном случае в отдельном массив. Результат будет выглядеть так:

Array 
(
[TIMESLOTID] => 27 
[DATE] => 
    Array 
    (
    [DATE] => za 05-04-2014 15:00, 
    [DATE] => za 12-04-2014 15:00, 
    [DATE] => za 29-03-2014 15:00 
    ), 
[ProductID] => 196, 
[VariantID] => 1079 
), 
Array 
(
[TIMESLOTID] => 23, 
[DATE] => ma 07-04-2014 10:00, 
[ProductID] => 196, 
[VariantID] => 1083 
) 

Пожалуйста, помогите мне в этом. Заранее спасибо.

+3

Вы, как ожидается, чтобы показать вам попытки и сказать нам, где вы застряли точно. – PeeHaa

+0

@PeeHaa Мне удалось отслеживать записи из цикла, где значения совпадают. Но я застрял в объединении записи даты, как указано выше. Я пытаюсь array_merge и array_combine, но не получил точный формат. – Viral

ответ

0

Хорошо, поэтому некоторые замечания перед любым ответом.

Массив вы хотите получить недействителен, по некоторым причинам:

  • Вы не можете иметь несколько ключей с тем же именем.
  • Для сортировки причины, я (IMO) использовать глобальный массив с ключами (timeslotID) и значениями (массив с ProductID, variantID и датами, которые представляют собой массив с индексом и значениями)

Итак, действительный массив будет то, что:

Array(
    [27] => Array(
       [ProductID] => 196, 
       [VariantID] => 1079, 
       [Dates] => Array(
        [0] => 'za 05-04-2014 15:00', 
        [1] => 'za 12-04-2014 15:00' 
        ..... 
       ) 
    ), 
    [23] => Array(
       [ProductID] => 196, 
       [VariantID] => 1083, 
       [Dates] => Array(
        [0] => 'ma 07-04-2014 10:00' 
       ) 
    ) 
) 

Если массив форматируется так, то вы будете иметь возможность написать функцию, которая преобразует массив ввода в массив, как это. Надеюсь это поможет.

EDIT: теперь функция, ответственная за преобразование. я не проверял, но мне кажется, algoritmatically хорошо :)

function transformArray($inputArray){ 
    $toReturn = array(); 

    foreach($inputArray as $product){ 
     if(in_array($product['TIMESLOTID'],array_keys($toReturn))){ 
      array_push($toReturn[$product['TIMESLOTID']]['Dates'],$product['DATE']); 
     } 
     else { 
      $toReturn[$product['TIMESLOTID']] = array(
       'ProductID' => $product['ProductID'], 
       'VariantID' => $product['VariantID'], 
       'Dates' => array(
        $product['DATE'] 
       ) 
      ); 
     } 
    } 
    return $toReturn; 
} 
+0

Thanks Vincent. Это именно то, чего я хочу. Не могли бы вы рассказать мне, что я должен написать внутри цикла for, чтобы получить вышеупомянутый вывод? – Viral

+0

Там вы идете. Я редактировал свой первый пост. –

+0

Спасибо, Винсент. Отлично работает. – Viral

-1
$list = array(
     array 
     (
     'TIMESLOTID' => 27, 
     'DATE' => "05-04-2014 15:00", 
     'ProductID' => 196, 
     'VariantID' => 1079 
     ), 

     array 
     (
     'TIMESLOTID' => 27, 
     'DATE' => "12-05-2014 15:00", 
     'ProductID' => 196, 
     'VariantID' => 1079 
     ), 

     array 
     (
     'TIMESLOTID' => 27, 
     'DATE' => "29-03-2014 15:00", 
     'ProductID' => 196, 
     'VariantID' => 1079 
     ), 

     array 
     (
     'TIMESLOTID' => 23, 
     'DATE' => "07-04-2014 10:00", 
     'ProductID' => 196, 
     'VariantID' => 1083 
     ) 

    ); 
    $return = array(); 

    for($i=0;$i<sizeof($list);$i++) { 
     if(!array_key_exists($list[$i]['TIMESLOTID'], $return)) { 
      $return[$list[$i]['TIMESLOTID']] = $list[$i]; 
     } else { 
      if(sizeof($return[$list[$i]['TIMESLOTID']]['DATE']) == 1) { 
       $date = $return[$list[$i]['TIMESLOTID']]['DATE']; 
       $return[$list[$i]['TIMESLOTID']]['DATE'] = array($date,$list[$i]['DATE']); 
      } else { 
       array_push($return[$list[$i]['TIMESLOTID']]['DATE'],$list[$i]['DATE']); 
      } 

     } 
    } 
+0

Спасибо за ответ, но выше массив, который у меня есть, и я хочу объединить элементы, как я упоминал ниже в своем вопросе. – Viral

+0

он сливается с помощью цикла for: s, juste test it copy и paste i php file –

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