【问题标题】:PHP optimization with class使用类进行 PHP 优化
【发布时间】:2013-09-28 08:23:23
【问题描述】:

我在 codeigniter 中有一个项目,但不相关。

我必须使用一些搜索条件(例如(销售区域、价格、型号...))在许多外部服务器汽车中进行搜索。

我用 xml 向一些外部服务器进行查询,该服务器用 xml 响应我,现在我已经为每个提供程序(外部服务器)创建了一个模型。

在我的控制器中,我传递给每个模型搜索条件并返回一个像这样嵌套的数组:

$cars = array(
   'car' = array('id' => '', 'name' => '', 'year' => '', 'color' => ''...),
   'optional' = array('car_id' => '','key' => ''....),
   'variant' = array('car_id' => '','key' => ''....),
);

主数组包含三个数组,其中包含许多键和值,每个可选引用带有car_id的汽车,每个变体引用带有car_id的汽车。
当为每个模型返回这个数组时,我会进行合并,因为我创建的数组是这样的标准:

$car_array = array();
$car_provider1 = $this->provider1->getCar();
$car_provider2 = $this->provider2->getCar();
array_merge_recursive($car_array, $car_provider1, $car_provider2);

现在我的提供商的所有汽车都有一个大数组标准,它可以是一个非常大的数组,里面有三个数组,因为取决于搜索条件。

我的问题是: 像我这样有一个大的嵌套数组 final 会不会有内存问题或速度慢?

使用 spl 类更好吗?像ArrayIterator 或类似的东西? 因为我必须将最终数组传递给控制器​​,然后我必须将它传递给我的视图。我在打印页面之前将每个数组转换为 json,因为我使用主干打印所有内容。

但我的问题是:最好嵌套一个大数组还是有一些 spl 类来管理所有这些数据? (我只需要一个容器来存储数据,转换成 json 之后,然后进行一些检查,例如:我有一辆平等的汽车删除它,或者我不想要的可选,在其中检查或搜索的东西)。

对于我的目标来说,大数组是一个不错的选择吗?

【问题讨论】:

    标签: php arrays multidimensional-array spl arrayiterator


    【解决方案1】:

    也许我不完全了解您的情况,但我认为不需要 array_merge_recursive()

    假设你有这样的数据:

    <?php
    
    $carsResponse1 = array(
        array(
            'make' => 'Ford',
            'price' => 3500
        ),
        array(
            'make' => 'GM',
            'price' => 4900
        )
    );
    
    $carsResponse2 = array(
        array(
            'make' => 'Acura',
            'price' => 2300
        ),
        array(
            'make' => 'Toyota',
            'price' => 3900
        )
    );
    
    $combined = array_merge($carsResponse1, $carsResponse2);
    
    print_r($combined);
    

    现在,运行它会产生:

    Array
    (
        [0] => Array
            (
                [make] => Ford
                [price] => 3500
            )
    
        [1] => Array
            (
                [make] => GM
                [price] => 4900
            )
    
        [2] => Array
            (
                [make] => Acura
                [price] => 2300
            )
    
        [3] => Array
            (
                [make] => Toyota
                [price] => 3900
            )
    
    )
    

    => 数组合并的非递归版本应该满足您的需求。

    至于答案本身:

    我认为使用数组或多维没有问题。使用 ArrayIterator 接口意味着只有实现该接口的类的对象才能使用 PHP 的数组语法和迭代功能来处理该类中的数据。

    无论该类在内部做什么,肯定都必须使用 PHP 的数组来实现。

    明智地使用“普通”数组很可能在 CPU 和 RAM 方面的性能优于任何更高级的过度设计的定制解决方案。

    如果您正在处理的数据集不是很大(数千到数万条记录),如果您确实必须一次处理所有数据,我认为将它们存储在数组中没有问题。

    如果出现问题,您可以查看分页,因此您一次只处理少量数据。

    实际上,从一开始就为分页设计服务是最好的做法,而不是一次处理所有数据,但是由于您没有提到它,我假设您的所有外部服务都无法处理分页.

    【讨论】:

    • 你的数组是扭曲的,我在数组里面有数组,car是里面的主要数组还有其他数组car,可选和模型
    • 好的,现在我明白了 array_merge_recursive() 的必要性,如果你真的想合并来自提供者的结果。我没有从您的问题中得到的一件事是提供者是返回多个结果还是一个结果。在您的代码中,您有“cars”(复数)变量,但内容是没有列表类型结构的单个结果,并且 API 名称 (getCar()) 表示单个汽车。但我想我的主要答案仍然存在,我认为将它实现为数组没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2017-05-27
    • 2015-08-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多