PHP,哎呀;为可变深度的分类项目选择正确的设计模式并显示项目链接

标签 php algorithm oop design-patterns data-structures

介绍

你好,

我想建立一个像这样的大数据结构:

[products]
   .[cat_1]
      .[cat_1.1]
         .[item-A] //type 1
         .[item-B] //type 1
         . ...
      .[cat_1.2]
         .[item-X] //type 2
   .[cat_2]
      .[item-Y] //type 3

到目前为止一切顺利。

目标

由于该网站应该是一种目录,因此 URL 将是例如:

www.example.com/products/cat_1/.../cat_Y/

该 URL 上的行为应该是:向所有子项(仅项目或仅子组)显示其预览图像和指向 example.com/products/cat_1/.../cat_Y/item-X。 Itemtypes当然是不同的。

我做了什么

我实现了基于复合模式的结构,因此节点和叶子有一个共同的基类,在我的例子中,它保存了对象的名称。节点包含叶子或节点的数组,该数组由称为 addChild() 的方法填充。

实现类似这样:

<?php
abstract class Base
{
    public $name;
    public $previewImage; //path to preview image

    public function __construct($name,$preview){
        $this->name=$name;
        $this->previewImage=$preview;
    }
}

class SubGroup extends Base{ 
    public $children= array();

    public function getChildrenByPath(Array $subGroupPath){ 
        //example: array("cat_1","cat_1-1",...);

        $subChildren=$this->children;

        foreach($subGroupPath as $currentPathStep){//follow subGroupPath
            foreach($subChildren as $currentChildr){// step through children and compare to path
                if($currentChild->uriPattern == $currentPathStep){                  
                    $subChildren=$currentChild->getChildren();
                    break; //end foreach
                }
            }
        }
        return $subChildren;
    }


    public function addChild(Base $new_child){
        $this->children[]=$new_child;
    }

    public function getChildren(){          
        return $this->children;
    }
}

class ProductType01 extends Base{
    public property1,property2,property3;
}
?>

对象/数据结构

我在一个单独的 php 文件中设置了一些项目来创建一个虚拟结构并尝试玩(稍后可以在数据库中):

$cat01 = new SubGroup("category 01","preview_cat_01.png");
$cat01->addChild( new ProductType01("Item-01","preview_01.png"));
$cat01->addChild( new ProductType01("Item-02","preview_02.png"));
...
$products = new subGroup("","","products"); //very first node
$products->addChild($cat01);

因此 addChild() 方法将项目添加到第一个类别的数组中。

介绍

<main>
<?php
    $children=$products->getChildrenByPath($uri);
    foreach($children as $value){
        echo "<div class='previewImage_element'>";
        echo "<img src='".$value->previewImage."' style='width:calc(120px *4/3);height:calc(120px*3/4);'>";
        echo "<br /><a href='".."'>".$value->name."</a></div>\n";
    }
?>
</main>

这就是我在表格结构中列出预览图像的方式,当然没问题。 这也可以作为一种方法自动化。

问题

我不知道复合(以及我构建它的方式)是否是正确的设计模式以及达到所需灵 active 和易于实现结构的最佳方法。乍一看,复合模式似乎与我的分层数据相匹配,但要完成一个简单的实现还有很多工作要做。

例如:如何建立项目的超链接,因为我无法向上移动树结构来收集上面的所有级别?

我不是在寻找一种“简单”的方法来设置类,而是在寻找一种轻松使用它们的方法。

内部数组是实现它的方法还是有更复杂的方法来指向子节点/子节点?

有了这种结构,你们将如何实现多语言功能?

我可以用什么方式(尽可能)将数据和 html 分开?

这是开始的好方法吗?有什么提示吗?有帮助吗?非常欢迎批评!!

最佳答案

您可以在您的基类中添加一个父变量并在 addChild 中设置它。检查 null 是必要的,但它允许您在树层次结构中双向移动。

关于PHP,哎呀;为可变深度的分类项目选择正确的设计模式并显示项目链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32614624/

相关文章:

php - Mysql NULL字段和php isset?

php - 对一组相似的词进行分组

php - 如何将 js 字符串变量传递给 php 而不丢失换行符和空格?

php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数 1 是资源

algorithm - 查找强连接组件之间的弧

摄氏度到华氏度的转换总是在摄氏度下显示零

java - 为什么我的输入中出现这样的空值

oop - UML 组合属性不是类中的特征?

c++ - 在派生类中调用多个虚函数

java - Thymeleaf 没有对象类?