2016-04-29 4 views
1

я доступ к детали продукта через Amazon API и получить это в моем массиве данных:PHP многомерный массив обратный поиск (Amazon API продукта)

["BrowseNodes"]=> 
     array(1) { 
     ["BrowseNode"]=> 
     array(3) { 
      [0]=> 
      array(3) { 
      ["BrowseNodeId"]=> 
      string(10) "7421468011" 
      ["Name"]=> 
      string(24) "Educational & Nonfiction" 
      ["Ancestors"]=> 
      array(1) { 
       ["BrowseNode"]=> 
       array(3) { 
       ["BrowseNodeId"]=> 
       string(4) "4390" 
       ["Name"]=> 
       string(14) "Graphic Novels" 
       ["Ancestors"]=> 
       array(1) { 
        ["BrowseNode"]=> 
        array(3) { 
        ["BrowseNodeId"]=> 
        string(4) "4366" 
        ["Name"]=> 
        string(23) "Comics & Graphic Novels" 
        ["Ancestors"]=> 
        array(1) { 
         ["BrowseNode"]=> 
         array(4) { 
         ["BrowseNodeId"]=> 
         string(4) "1000" 
         ["Name"]=> 
         string(8) "Subjects" 
         ["IsCategoryRoot"]=> 
         bool(true) 
         ["Ancestors"]=> 
         array(1) { 
          ["BrowseNode"]=> 
          array(2) { 
          ["BrowseNodeId"]=> 
          string(6) "283155" 
          ["Name"]=> 
          string(5) "Books" 
          } 
         } 
         } 
        } 
        } 
       } 
       } 
      } 
      } 
      [1]=> 
      array(3) { 
      ["BrowseNodeId"]=> 
      string(5) "13871" 
      ["Name"]=> 
      string(20) "History & Philosophy" 
      ["Ancestors"]=> 
      array(1) { 
       ["BrowseNode"]=> 
       array(3) { 
       ["BrowseNodeId"]=> 
       string(2) "75" 
       ["Name"]=> 
       string(14) "Science & Math" 
       ["Ancestors"]=> 
       array(1) { 
        ["BrowseNode"]=> 
        array(4) { 
        ["BrowseNodeId"]=> 
        string(4) "1000" 
        ["Name"]=> 
        string(8) "Subjects" 
        ["IsCategoryRoot"]=> 
        bool(true) 
        ["Ancestors"]=> 
        array(1) { 
         ["BrowseNode"]=> 
         array(2) { 
         ["BrowseNodeId"]=> 
         string(6) "283155" 
         ["Name"]=> 
         string(5) "Books" 
         } 
        } 
        } 
       } 
       } 
      } 
      } 
      [2]=> 
      array(3) { 
      ["BrowseNodeId"]=> 
      string(5) "11256" 
      ["Name"]=> 
      string(20) "Folklore & Mythology" 
      ["Ancestors"]=> 
      array(1) { 
       ["BrowseNode"]=> 
       array(3) { 
       ["BrowseNodeId"]=> 
       string(5) "11232" 
       ["Name"]=> 
       string(15) "Social Sciences" 
       ["Ancestors"]=> 
       array(1) { 
        ["BrowseNode"]=> 
        array(3) { 
        ["BrowseNodeId"]=> 
        string(10) "3377866011" 
        ["Name"]=> 
        string(26) "Politics & Social Sciences" 
        ["Ancestors"]=> 
        array(1) { 
         ["BrowseNode"]=> 
         array(4) { 
         ["BrowseNodeId"]=> 
         string(4) "1000" 
         ["Name"]=> 
         string(8) "Subjects" 
         ["IsCategoryRoot"]=> 
         bool(true) 
         ["Ancestors"]=> 
         array(1) { 
          ["BrowseNode"]=> 
          array(2) { 
          ["BrowseNodeId"]=> 
          string(6) "283155" 
          ["Name"]=> 
          string(5) "Books" 
          } 
         } 
         } 
        } 
        } 
       } 
       } 
      } 
      } 
     </pre> 

Дело в том, мне нужно, чтобы извлечь значение «Политика & Общественные науки «в этом примере и глубина не всегда одинакова. Однако каждый массив начинается то же самое с конца - Книги -> Предметы -> Политика & Общественные науки

Поскольку я бегу сотни книг через мой сценарий, мне нужен автоматизированный способ получения 3-го уровня со дна. Это всегда 3-й уровень от конца массива.

+0

Какая у вас попытка решить эту проблему? –

+0

Я играл с некоторыми параметрами (array_reverse, foreach, for ...), но, честно говоря, я понятия не имею, как сделать последний элемент неподвижной точкой и работать с ним обратно. – Oktarin

ответ

1

Я сделал эти функции, которые вы можете использовать для поиска третьего «предмета» с конца. но я думаю, что лучше apporach, чем при использовании рекурсии (как я):

function isItEnd($array){ 
    return !array_key_exists('Ancestors', $array); 
} 

function getThirdFromEnd($category){ 
    if(!isItEnd($category)){ 
    $away_from_parent = getThirdFromEnd($category['ancestors']['BrowseNode']); 
    if($away_from_parent == 0){ 
     $away_from_parent = $category['ancestors']['BrowseNode']; 
    } else { 
     $away_from_parent--; 
    } 
} else { 
    $away_from_parent = 2; 
} 
return $away_from_parent; 
} 

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

Вы можете использовать его как это:

$thirds = array(); 
foreach($browseNodes['BrowseNodes']['BrowseNode'] as $category){ 
    $thirds[] = getThirdFromEnd($category); 
} 
print_r($thirds); 

рабочую демо: https://3v4l.org/SeKvM

надеюсь, что это поможет, но не лучше сначала разобрать массив на два размера (с сохраненными «родителями»), а затем искать определенный идентификатор или имя?

+0

Спасибо, Джимми. Однако «предки» многократно называются целым массивом. Могу ли я использовать значения «Книги» или «Тема»? – Oktarin

+1

Я использовал «предков» **, потому что ** его в полном массиве EXCEPT конечный элемент, который является способом найти конец массивов :), если вы хотите использовать «Книги» вместо этого, тогда выполните проверку следующим образом: if ($ category ["name"] == "Books"), а затем соответствующим образом изменить функцию рекурсии, чтобы не искать родителей. – Jimmmy

+0

ahh right! Теперь я понимаю. isItEnd вернет true, когда попадет в последний элемент, у которого нет «предка». – Oktarin