Прежде чем я начну, я хочу извиниться за, возможно, легкую для вас проблему, поскольку я в этом новичок. Итак, перейдем сразу к делу.
У меня огромный многомерный массив (это дерево категорий, и каждая категория имеет внутри еще одну категорию, еще одну и еще одну и т. д.). Весь этот массив фактически содержит объекты (каждый ключ является экземпляром объекта категории), поэтому у него есть все внутри (Id, parentId, дочерние элементы (массив) и т. д.).
У меня также есть второй массив, который представляет собой простой массив идентификаторов (одномерный массив, только с числами - идентификаторами категорий).
Теперь я пытаюсь найти эти несколько идентификаторов из моего второго массива в дереве и получить (в результате этого сравнения) наименьший идентификатор в каждой ветви дерева.
Для действительно простого примера (извините, это действительно сложно объяснить):
Древовидный массив:
И в моем втором массиве ВСЕ маршрут до категории, которая мне нужна + другие маршруты, например:
[1] = 1,
[5] = 5,
[11] = 11,
[12] = 12,
[4] = 4,
[8] = 8
И мне нужно получить ТОЛЬКО последнюю категорию ветки, КОТОРАЯ ИМЕЕТ ВТОРОЙ МАССИВ, так что здесь результат должен быть 12 и 8, потому что они являются последними элементами в своих ветвях, если вы понимаете, что я имею в виду ... t должен быть листом.
Спасибо за любые идеи !!
// Обновлено: я действительно забыл показать то, что пытался, мне очень жаль, поехали:
private function buildRows($products): array {
$export = [ ]; // final array ($row)
foreach ( $products as $product ) {
$producer = $this->producers [$product->getProducerId ()];
foreach ( $product->getSpecies () as $specie ) {
$data = [
'id' => $product->getId (),
'url_vyrobce' => $producer->getUrl ()
];
$tempUrl = $producer->getUrl();
foreach ( $this->csvRegions as $headCode ) {
foreach ( $product->getRegions () as $region ) {
$data [$region->getRegionCode () . '_name'] = $region->getName ();
}
}
$data ['catalog_no'] = $product->getCatalogNo ();
$data ['catalog_no_suffix'] = $specie->getSuffix ();
$productCategories = $product->getCategories();
$leaf = [];
$leaf[] = $this->findCategoryLeaves($product->getCategories(), $this->categoryTree);
dump($leaf);
foreach ( $productCategories as $catId ) {
//$ids[] = $this->findCategoriesRoot($catId, $this->categoryTree);
$category = $this->categoryDao->getCategory ( $catId );
$parentId = $category->getParentCategoryId();
//$this->categoryDao->loadParents ( $category ); // get parrents for this needle
/*foreach($this->categoryTree as $key => $cat){
if ($cat['id'] === $parentId){
$parents[] = $key;
}
dump($parents[]);
}*/
/*
while ($parent = $category->getParentCategory()) {
if (in_array ( $parent->getId(), $productCategories )) {
array_push ( $parents, $parent->getId() );
}
if ($category->getParentCategory()) {
$category = $parent;
}
}
*/
}
$row = [ ];
foreach ( $this->createCsvHead () as $col ) {
if (isset ( $data [$col] )) {
$row [] = $data [$col];
} else {
$row [] = '';
}
}
$export [] = $row;
}
}
return $export;
}
Здесь я просто делал некоторые приготовления для файла CSV, который в конечном итоге будет создан из данных. Я вызываю функцию
$this->FindCategoryLeaves($product->getCategories, $this->categoryTree)
Эта функция находится ниже (она не завершена, потому что я застрял в решении. Я думаю, она должна быть рекурсивной, но я не могу заставить ее работать)
private function findCategoryLeaves($productCategory, $categoryTree){
dump($categoryTree);
$leaves = [];
$branches = [];
dump($productCategory);
$lastElement = end($productCategory);
foreach($productCategory as $productCatId){
foreach($categoryTree as $catTree){
$catTreeId = $catTree->getId();
if ($catTreeId === $productCatId){
if ($productCatId === $lastElement){
$branches[] = $productCatId;
dump($catTreeId . ' | LAST ID');
findCategoryLeaves($productCategory, $categoryTree);
}
//}else{
// $leaves[] = $productCatId;
}
dump($catTreeId .' | ID NOT FOUND!');
/*$subs = $catTree->getSubcategories();
if (array_key_exists($productCategoryId, $subs)){
dump($subs);
$leaf[] = $productCategoryId;
$this->findCategoryLeaves($productCategoryId, $subs);
}else{
dump($leaf);
return $leaf;
}*/
}
}
}
Кроме того, если вы хотите получить помощь на этом сайте, вы должны показать нам, что вы уже пробовали. Пожалуйста, прочтите Как спросить.
извлеките идентификаторы из многомерного массива с помощью array_column(), затем сравните
@misorude это не обязательно должен быть лист целой ветви дерева. Например, когда у вас есть категория футболок, и в ней есть подкатегория других вариантов, которые не являются обязательными. По сути, для меня «воображаемый лист» - это последний известный мне идентификатор.
@misorude plus Мне очень жаль, что я забыл показать свой код. Мои наилучшие извинения за это. Я отредактировал вопрос






Как
8является последним элементом его ветки, когда у вас есть13с отступом под ним?