2016-03-10 3 views
0

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

[Air Strike] => Array 
    (
     [defindex] => Array 
      (
       [0] => 1104 
      ) 

     [prices] => Array 
      (
       [6] => Array 
        (
         [Tradable] => Array 
          (
           [Craftable] => Array 
            (
             [0] => Array 
              (
               [currency] => metal 
               [value] => 0.05 
               [last_update] => 1415072318 
               [difference] => -0.06 
               [value_raw] => 0.05 
              ) 

            ) 

           [Non-Craftable] => Array 
            (
             [0] => Array 
              (
               [currency] => metal 
               [value] => 0.11 
               [last_update] => 1436478504 
               [difference] => 0.03 
               [value_raw] => 0.11 
              ) 

            ) 

          ) 

        ) 

       [11] => Array 
        (
         [Tradable] => Array 
          (
           [Craftable] => Array 
            (
             [0] => Array 
              (
               [currency] => metal 
               [value] => 4 
               [last_update] => 1456277271 
               [difference] => -0.165 
               [value_raw] => 4 
              ) 

            ) 

           [Non-Craftable] => Array 
            (
             [0] => Array 
              (
               [currency] => metal 
               [value] => 3.66 
               [last_update] => 1456277553 
               [difference] => -0.34 
               [value_raw] => 3.66 
              )     

            ) 

          ) 

        ) 

      ) 

    ) 

Есть ли способ, я могу удалить подмассива в точке, где они, за неимением лучшего слово, расходятся, если элемент является либо неприменимым, либо ['value_raw'] меньше 3?

Мой желаемый результат будет таким:

[Air Strike] => Array 
(
    [defindex] => Array 
     (
      [0] => 1104 
     ) 

    [prices] => Array 
     (
      [11] => Array 
       (
        [Tradable] => Array 
         (
          [Craftable] => Array 
           (
            [0] => Array 
             (
              [currency] => metal 
              [value] => 4 
              [last_update] => 1456277271 
              [difference] => -0.165 
              [value_raw] => 4 
             ) 

           ) 

          [Non-Craftable] => Array 
           (
            [0] => Array 
             (
              [currency] => metal 
              [value] => 3.66 
              [last_update] => 1456277553 
              [difference] => -0.34 
              [value_raw] => 3.66 
             )     

           ) 

         ) 

       ) 

     ) 

) 

Мои мысли по этому вопросу было перебрать все подмассив с вложенным Еогеасп() петлю и проверить значение [ «value_raw»] и является ли или нет он торгуется, но тогда как я узнаю, сколько подмассивов удалить, не удаляя слишком много? Возможно, идет назад, начиная с priceindex, а затем проверяя, содержит ли он более одного подмассива, и если он не удаляет его вместе со всем его содержимым?

+0

просто используйте 'foreach', затем' unset', основываясь на ваших критериях, используя эти ключи. – Ghost

+0

@Ghost Я попытался выполнить 'unset (array ['prices'])' в вложенном цикле foreach, но у него не было желаемый эффект – NoobieDoobie

+0

В вашем желаемом выходе последний элемент имеет ['value_raw'] <4 – fusion3k

ответ

0

Вы можете получить желаемый результат через ряд вложенных foreach() цикла:

foreach($airStrike['prices'] as $gKey => $group) 
{ 
    foreach($group as $sKey => $subGroup) 
    { 
     if($sKey !== 'Tradable') unset($airStrike['prices'][$gKey][$sKey]); 
     else 
     { 
      foreach($subGroup as $iKey => $item) 
      { 
       if($item[0]['value_raw'] < 3) unset($airStrike['prices'][$gKey][$sKey][$iKey]); 
      } 

      if(!count($airStrike['prices'][$gKey][$sKey])) unset($airStrike['prices'][$gKey][$sKey]); 
     } 
     if(!count($airStrike['prices'][$gKey])) unset($airStrike['prices'][$gKey]); 
    } 
} 

3v4l demo

Элементы с ключом ≠ 'Передается' убираются. Подпункты «Tradable» обрабатываются и, если «value_raw» равен < 3, не установлены. Ссылаясь на ваш пример, подархивы «Craftable» и «Non-Craftable» рассматриваются с только одним дочерним массивом: если у них может быть более одного ребенка, вы должны добавить дополнительный foreach() iside foreach($subGroup).

Обратите внимание, что в конце уровня 2 и уровня-3 foreach() Я проверяю, является ли текущий массив пустым, а если он есть - я его отключил.