首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >foreach,直到找到一些值

foreach,直到找到一些值
EN

Stack Overflow用户
提问于 2018-02-02 00:07:01
回答 1查看 58关注 0票数 1

我有一个代码,从数据库中获取类别,但我不知道如何获得所有子类别(父母)。

这是我的php代码:

代码语言:javascript
运行
复制
function get_the_category($allCats,$filter_id = null) {

$re_struct_cat = array();
$filter_id =  10;
$ids = array();
$xx = array();
foreach($allCats as $cat_key=>$cat_val) {
    $re_struct_cat[$cat_val["id"]] = array(
        "title" => $cat_val["cat_title"],
        "parent" => $cat_val["cat_parent"],
    );

$ids = array_merge($ids,array($cat_val["id"]));
}

foreach($ids as $k=>$v) {
    if($re_struct_cat[$v]["parent"]) {
        $xx[] = $re_struct_cat[$re_struct_cat[$v]["parent"]];
    }
}

return $xx;
//return $re_struct_cat;

//print_r($re_struct_cat);
}

我到底想要什么

我有一个表,它有3列id,title,parent

代码语言:javascript
运行
复制
ID      TITLE       PARENT
1       Science     0
2       Math        1
3       Algebra     2
4       Analyse     2
5       Functions   4

因此,如果变量为filter_id = 10,我得到的是cat_parent = 4,所以我想获取该值并在数组中查找它,如果找到另一个cat_parent,则执行相同的操作,直到找到0或null值

EN

Stack Overflow用户

发布于 2018-02-02 02:45:56

这不是最优的解决方案,但您可以使用iterators

首先,创建自定义迭代器,它可以处理类别:

代码语言:javascript
运行
复制
class AdjacencyListIterator extends RecursiveArrayIterator
{
    private $adjacencyList;

    public function __construct(
        array $adjacencyList,
        array $array = null,
        $flags = 0
    ) {
        $this->adjacencyList = $adjacencyList;

        $array = !is_null($array)
            ? $array
            : array_filter($adjacencyList, function ($node) {
                return is_null($node['parent']);
            });

        parent::__construct($array, $flags);
    }

    private $children;

    public function hasChildren()
    {
        $children = array_filter($this->adjacencyList, function ($node) {
            return $node['parent'] === $this->current()['id'];
        });

        if (!empty($children)) {
            $this->children = $children;
            return true;
        }

        return false;
    }

    public function getChildren()
    {
        return new static($this->adjacencyList, $this->children);
    }
}

它是从我的another answer中获取的。

然后,您可以简单地遍历此迭代器,直到找到所需的id:

代码语言:javascript
运行
复制
$id = 5;
$categories = [];
$result = null;
foreach ($iterator as $node) {
    $depth = $iterator->getDepth();
    $categories[$depth] = $node['categoryname'];

    if ($node['id'] === $id) {
        $result = array_slice($categories, 0, $depth + 1);
        break;
    }
}

这是the demo

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48567049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档