Я получаю доступ к информации о продукте через 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-й уровень от конца массива.
Я сделал эти функции, которые вы можете использовать, чтобы найти третий «предмет» с конца. но я думаю, что есть лучшее применение, чем использование рекурсии (как и я):
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 не вернет true (достигнут конец массива), затем по числовому счетчику вернет третьего родителя с конца
Вы можете использовать это так:
$thirds = array();
foreach($browseNodes['BrowseNodes']['BrowseNode'] as $category){
$thirds[] = getThirdFromEnd($category);
}
print_r($thirds);
рабочая демонстрация:
https://3v4l.org/SeKvM
надеюсь, это поможет, но не лучше ли будет сначала разобрать массив в двумерный (с сохраненными «родителями»), а затем искать конкретный идентификатор или имя?
Других решений пока нет …