2012-03-02 3 views
0

У меня есть многомерный массив, который выглядит следующим образом:Комбинирование многомерного массива значений в PHP

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [description] => UPS Ground 
        [delivery-time] => 1-5 business days 
        [shipping-amount] => 1299 
       ) 

      [1] => Array 
       (
        [description] => UPS 3 Day Select 
        [delivery-time] => 3 business days 
        [shipping-amount] => 2459 
       ) 

      [2] => Array 
       (
        [description] => UPS 2nd Day Air 
        [delivery-time] => 2 business days 
        [shipping-amount] => 3239 
       ) 
     ) 

    [1] => Array 
     (
      [0] => Array 
       (
        [description] => UPS Ground 
        [delivery-time] => 1-5 business days 
        [shipping-amount] => 864 
       ) 

      [1] => Array 
       (
        [description] => UPS 3 Day Select 
        [delivery-time] => 3 business days 
        [shipping-amount] => 1109 
       ) 

      [2] => Array 
       (
        [description] => UPS 2nd Day Air 
        [delivery-time] => 2 business days 
        [shipping-amount] => 1633 
       ) 
      [3] => Array 
       (
        [description] => UPS Overnight 
        [delivery-time] => 1 business day 
        [shipping-amount] => 3528 
       ) 

     ) 

) 

Я пытаюсь достичь 3 вещи:

  1. Добавить значения shipping-amount где description одинакова по размерам
  2. Оставьте array, если он содержит description, которого нет в любых других измерениях
  3. Бросьте измерение раз судоходные-суммы комбинируются

Там может быть несколько массивов первого уровня (а не только 2, как показано здесь), но это так глубоко, как размеры будут идти. Я ищу следующий результат:

Array 
(
    [0] => Array 
     (
      [description] => UPS Ground 
      [delivery-time] => 1-5 business days 
      [shipping-amount] => 2163 
     ) 
    [1] => Array 
     (
      [description] => UPS 3 Day Select 
      [delivery-time] => 3 business days 
      [shipping-amount] => 3568 
     ) 
    [2] => Array 
     (
      [description] => UPS 2nd Day Air 
      [delivery-time] => 2 business days 
      [shipping-amount] => 4872 
     ) 
) 

Заранее благодарим за внимание!

+1

Это действительно звучит слишком, как «напишите мне код» вместо описания конкретной проблемы. Что вы пробовали, где вы застряли? – deceze

+0

Что я пробовал? Я пробовал читать руководство PHP через десятки удивительно смешных функций массива, чтобы выяснить, какие из них подходят для этого сценария. Я полагаю, что это может быть некоторая комбинация 'foreach',' array_merge', 'array_map',' key() ', но я не знаю, какой порядок или функции имеют наибольший смысл. У меня была большая помощь для проблем, которые бросали мне вызов здесь раньше, поэтому я подумал, что я попрошу снова вместо того, чтобы тратить время на то, чтобы терять время. –

+0

Потратьте время, затрачиваемое вокруг, часто является единственным истинным способом научиться делать это самостоятельно. : o) – deceze

ответ

2

Я думаю, что это будет работать:

$final=array(); // the final array 
$count=array(); // keeps track of instances of each description 
$loops=count($array); 
for($a=0;$a<$loops;$a++){ 
    foreach($array[$a] as $s){ //loop through child arrays 
     if($count[$s['description']]>0){ //check if description exists in $count 
      foreach($final as $k=>$v){ //add sums to the final if it does exist 
       if($final[$k]['description']==$s['description']){$final[$k]['shipping-amount']+=$s['shipping-amount'];} 
      } 
     }else{ //if it doesn't exist in the count array, add it to the final array 
      $final[]=$s; 
     } 
     $count[$s['description']]++;//update the count array 
    } 
} 
//Unset singletons, using the count array 
foreach($count as $k=>$v){ 
    if($v==1){ 
     foreach($final as $key=>$val){ 
      if($final[$key]['description']==$k){unset($final[$key]);} 
     } 
    } 
} 
print_r($final); 

я застрял на вопрос в течение последних 2-х дней и чувствую вас, так что я надеюсь, что это помогает.

+1

Если это не сработает, это, по крайней мере, то, что вы можете настроить и получить результат, который вы ищете. –

+0

Спасибо Тим. Даже если это не сработает, я не ищу копию/вставку. Просто что-то, чтобы начать меня в правильном направлении. Приветствую вас. –

0

Я не буду писать код, потому что согласен с deceze.

Тем не менее, моя рекомендация будет пользовательскую функцию, которая:

  • петли над входной массив
  • применяет логику вы описанную
  • возвращение сгущенное массив

Учитывая ваши конкретные требования - это не одна, волшебная функция PHP, которая делает это. Тем не менее, есть десятки PHP array functions, которые вы могли бы использовать в своей пользовательской функции.

Если вам нужна помощь в данной статье, обновите сообщение или задайте новый вопрос.

0

Я бы рекомендовал использовать функцию array_walk с обратным вызовом, который обрабатывает ваши конкретные требования для добавления и уникальности.

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