php - 在基于 PHP 的商店中需要有关算法实现和创建的建议

标签 php algorithm

几天来,我一直在尝试处理我用 PHP 编写的在线商店的算法实现。我不知道问题是否只是实现,或者可能是糟糕的算法设计。 Hovewer,对我来说似乎很好。我只是没有检查它的复杂性,但这是一个问题。

在对同一算法进行了长时间的审议之后,没有考虑实现,我想到了使用二叉搜索树 (bst),并将附加数据插入到列表中,该列表由用户定义的信息组成(稍后介绍)。将显示整个订单列表,或使用 inorder 方法返回。

我是这样写的:

  • 如果输入对象日期大于当前对象,则向右走

  • 如果输入对象日期小于当前对象向左走

  • 如果日期相同则留在原地

  • 如果字段为空,检查产品是否有货

    • 如果到位完成

    • 如果没有什么都不做退出

  • 如果字段已满

{检查列表中是否有这个用户id

  • 如果是,则检查订单优先级

  • 如果没有什么也不做退出

    • 检查是否有库存
  • 如果是则替换记录并退出

  • 如果没有什么也不做退出

{如果列表中没有用户id,检查产品是否有货

  • 如果是则将元素放在末尾

  • 如果没有则什么都不做并退出

也许它看起来有点糟糕,但我无法进行缩进。

数据循环传输到算法中,直到订单列表结束。该列表是无序的。

这是我的实现:

class BinaryTree {    
    private $predescor = array(
        'd'=>array('data'=>0),
        'p'=>null,
        'r'=>null,
        'l'=>null
    );

    private $ancestor = array(
        'd'=>array('data'=>0),
        'p'=>null,
        'r'=>null,
        'l'=>null
    );

    private $i = 0;

    public function insertIntoTree(&$root,$element)
    {
        $this->predescor = $root;
        $this->predescor;

        while($this->predescor)
        {
            if($element['d']['data']==$this->predescor['d']['data'])
            {
                $this->inertIntoList($element,$this->predescor['d']);
                return true;
            }

            $this->predescor = $this->predescor;
            if($element['d']['data']<$this->predescor['d']['data'])
            {
                $this->predescor = $this->predescor['l'];
            }
            else
            {
                $this->predescor = $this->predescor['r'];
            }
        }

        $element['p'] = $this->predescor;

        if(!$this->predescor)
        {
            $root = $element;
        }
        else if($element['d']['data']<$this->predescor['d']['data'])
        {
            $this->predescor['l'] = $element;
        }
        else
        {
            $this->predescor['r'] = $element;
        }

        return true;
    }    
    public function putList(&$list,$root)
    {
        if($root!=null)
        {
            $this->putList($list, $root['l']);
            $lista[$this->i] = $root;
            $this->i++;
            $this->putList($list, $root['r']);
        }
        return;
    }

    private function insertIntoList($element,&$position)
    {
        if($position == null)
        {
            $position = $element;
            return true;
        }

        foreach($position['user'] as &$key)
        {
            if($key == $element['d']['user'])
            {
                if($key['priority']<$element['d']['user']['priority'])
                {
                    return false;
                }
                else if($key['priority']==$element['d']['user']['priority'])
                {
                    return false;
                }
                else
                {
                    if(Orders::checkOrder($element['d']['user']['order']))
                    {
                        $key['order'] = $element['d']['user']['order'];
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }

        //@todo add at the end
        return true;
    }
}

我想建议是否有比使用由相当复杂的数组组成的 bst 更简单的方法,这也更容易实现?因为现在我不能用 PHP 实现它。

提前谢谢你。

最佳答案

我根本不会开始用 php 编写代码。

我会开始将其构建到数据库中。 (“订单”表示一个数据库。)我将开始 澄清几点。假设一个订单可以有多个订单项。 . .

  • 自上次订单以来的天数似乎清楚地适用于该订单, 不适用于个别产品。
  • 用户可以“一次只携带一个请求”。要求 什么?这似乎没有意义适用于 订购订单的订单项。
  • 订单优先级似乎清楚地适用于订单,而不是行 项目。但是,项目优先级可能更有意义。 (客户首先需要什么产品?)
  • 产品是否有货似乎适用于订单项,而不是 整个订单。

我会开始创建两个 View 。 (不是因为您最终需要两个 View ,而是因为有些事情仍然不清楚。)

一个 View 与应用于订单的“排名”有关,会计算或显示三件事。

  • 自上次订购以来的天数。
  • 这个订单是“一次一个请求”吗?
  • 订单优先级。

如果分配给这三件事的数字在比例上是一致的,您可以只对这三列进行排序。但这不太可能。您可能需要对每个因素进行加权,可能是乘以一个“加权”因素。对结果的计算应该可以让您将它们按有用的顺序排列。目前尚不清楚计算最好是在 View 中还是在存储过程中完成。

另一个 View 与订单项是否有货有关。目前尚不清楚一个订单项缺货是否意味着整个订单不完整,或者一个订单项缺货是否会改变与上述其他项一起缩放的加权数字的计算。 (您可以为这些方法中的每一种提供一个很好的论据。)

关于php - 在基于 PHP 的商店中需要有关算法实现和创建的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8387084/

相关文章:

algorithm - 具有给定反转的子阵列数

java - 针对这个问题的动态程序是如何设计的呢?

作为函数调用的 PHP 类

php - 从 php 和在 Mysql Workbench 中查询特殊字符的结果不同

c# - 如何在 C# 中以编程方式创建柔和的颜色?

java - 实现二次算法

c# - 数字列表 - 如何高效查找小于或等于 N 的最大数字

php - 如何使用 Laravel 5 获得人类可读格式的时间差异?

php - 使用 Foreach 循环仅获取最后 2 个数组

php - joomla 安装新语言 DateTime::__construct(): 解析时间字符串失败 (jerror)