2014-12-23 7 views
3

У меня вопрос о фильтрации многомерного массива в PHP. То, что я хотел бы достичь, - это вытащить определенный массив элементов (значение медиаконтента) из существующего массива. Это то, что я получил до сих пор:Фильтровать многомерный массив по ключу в PHP

Existing многомерный массив:

$multidimensional_array = array(
    'entry' => array(
     0 => array(
      'width' => array(
       '$t' => '1536' 
      ), 
      'height' => array(
       '$t' => '2048' 
      ), 
      'id' => array(
       '$t' => '878974' 
      ), 
      'mediagroup' => array(
       'mediacontent' => array(
        'url' => 'http://website/urltotheobject.png', 
        'width' => 384, 
        'medium' => 'image', 
        'type' => 'image/jpeg', 
        'height' => 512 
       ) 
      ) 
     ), 
     1 => array(
      'width' => array(
        '$t' => '5486' 
      ), 
      'height' => array(
        '$t' => '1144' 
      ), 
      'id' => array(
       '$t' => '485435' 
      ), 
      'mediagroup' => array(
       'mediacontent' => array(
        'url' => 'http://website/urltotheobject.png', 
        'width' => 512, 
        'medium' => 'image', 
        'type' => 'image/jpeg', 
        'height' => 384 
       ) 
      ) 
     ) 
    ) 
); 

Функция (не правильно работает), чтобы фильтровать массив

function filterResponseByKey($keyToFilter,$array){ 

    foreach ($array as $key => $value) 
    { 
     if($key == $keyToFilter) 
     { 
      return $value; 
     } 
     elseif(is_array($value)) 
     { 
      $result = filterResponseByKey($keyToFilter, $value); 

      if($result != false) 
      { 
       return $result;    
      } 
     } 
    } 
    return false; 
} 

Я довольно новый для PHP и надеюсь, что вы, ребята, можете указать мне в правильном направлении и сказать мне, что я делаю неправильно здесь.

Я занимался исследованиями на следующих (альтернативных) веб-сайтах, но я не смог найти ответ, соответствующий моим потребностям.

understanding recursion, PHP filter_array

+1

Не нужно возвращать, просто пропустить петлю. Итак, вы хотите очистить те, где, например, ширина 'mediacontent' больше, чем определенное значение? – vaso123

+0

Верно, не используйте рекурсию, и если вы просто хотите получить несколько данных из исходного массива, просто создайте новый и вернетесь с этим. – Gerifield

+0

Я бы использовал объекты и подход класса, но если вы действительно хотите, чтобы рекурсия проверяла мой ответ – zardilior

ответ

1

Для вашего конкретного случая, я рекомендовал бы вам иметь массив объектов, как элементы 0 и 1 подобны, и медиаконтента в качестве внутренней переменной.

Если вы действительно хотите сделать это вы можете получить массив медиаконтента только с помощью карты

array_map($multidimensional_array['entry'],function($obj){ 
    return $obj['mediagroup']['mediacontent']; 
}); 

Если то, что вы хотите что-то более динамичным и рекурсивный

function recursive_filter_by_key($keyname,$list){ 
    $result=[]; 
    foreach($list as $key=>$obj){ 
     if($key==$keyname) 
      array_push($result,$obj); 

     else if(gettype($obj)=='array')//not necesary to check if its equal to the $key as this wouldn't run if it was 
       $result = array_merge($result,recursive_filter_by_key($obj)); 
    } 
    return $result; 

} 

Эта функция может возвращать полные массивы в пределах массива результатов, если они являются значением ключа, который вы ищете

Я бы хотел, чтобы вы прокомментировали, хотя, как я думаю, у меня нет поддержки d ваш вопрос очень много.

Также есть еще один аналогичный пост на сайте в случае, если вы не пересекали его How to run array_filter recursively in a PHP array?

0

Вы можете попробовать этот способ также просто медиаконтента ....

$multidimensional_array = array(
     'entry' => array(
      0 => array(
       'width' => array(
        '$t' => '1536' 
       ), 
       'height' => array(
        '$t' => '2048' 
       ), 
       'id' => array(
        '$t' => '878974' 
       ), 
       'mediagroup' => array(
        'mediacontent' => array(
         'url' => 'http://website/urltotheobject.png', 
         'width' => 384, 
         'medium' => 'image', 
         'type' => 'image/jpeg', 
         'height' => 512 
        ) 
       ) 
      ), 
      1 => array(
       'width' => array(
        '$t' => '5486' 
       ), 
       'height' => array(
        '$t' => '1144' 
       ), 
       'id' => array(
        '$t' => '485435' 
       ), 
       'mediagroup' => array(
        'mediacontent' => array(
         'url' => 'http://website/urltotheobject.png', 
         'width' => 512, 
         'medium' => 'image', 
         'type' => 'image/jpeg', 
         'height' => 384 
        ) 
       ) 
      ) 
     ) 
    ); 

    function getMediaContent($item){ 
     return $item['mediagroup']['mediacontent']; 
    } 
    $mediacontent = array_map('getMediaContent', $multidimensional_array['entry']); 
    print '<pre>'; 
    print_r($mediacontent); 
1

Наиболее практичным решение этой uses iterators:

$iter = new RecursiveIteratorIterator(
       new RecursiveArrayIterator($multidimensional_array), 
       RecursiveIteratorIterator::SELF_FIRST 
); 
foreach($iter as $key => $value) { 
    if(ctype_alpha($key) && $key == 'mediacontent') { 
    echo "Media Content: ".print_r($value, true)."\n"; 
    } 
} 

Этот выход будет:

Media Content: Array 
(
    [url] => http://website/urltotheobject.png 
    [width] => 384 
    [medium] => image 
    [type] => image/jpeg 
    [height] => 512 
) 

Media Content: Array 
(
    [url] => http://website/urltotheobject.png 
    [width] => 512 
    [medium] => image 
    [type] => image/jpeg 
    [height] => 384 
) 

Итераторы являются очень недооцененной функцией PHP, хотя иногда они имеют сложный синтаксис, и в этом случае вас интересуют узлы вместо листьев, требующие дополнительного параметра режима. Однако рекурсивные итераторы упрощают много рекурсивных операций.

0
function filterResponseByKey($keyToFilter,$array){ 

    foreach ($array as $key => $value) 
    { 
     if($key === $keyToFilter) 
     { 
      return $value; 
     } 
     elseif(is_array($value)) 
     { 
      $result = filterResponseByKey($keyToFilter, $value); 

      if($result != false) 
      { 
       return $result;    
      } 
     } 
    } 
    return false; 
} 

Теперь работаем!

редактировать: объяснить:

Использование «==» проверяет, чтобы найти, если равны, независимо от типа, поэтому, когда он сталкивается с interger, он будет отбрасывать оба значения, чтобы проверить, как interger Int («anystring») приводит к 0, так что ключ 0 = строка 'mediacontent'

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