PHP:循环遍历数组/字符串编译器或其他东西的最快方法

时间:2016-05-16 22:28:39

标签: php mysql arrays xml csv

我们有一个PHP脚本循环来自不同网站的许多XML / CSV文件。现在我们设法构建一个好的XML / CSV解析器脚本。

我们编写的PHP脚本是通过一些BIG XML或CSV文件循环的。在这些XML或CVS文件中包含来自不同产品的条形码。

现在在脚本开始之前我用MySQL填充一个带有产品ID +条形码的数组,如下所示:

    function Barcodes_Array() { 

    $sql = "SELECT ProductId, Barcode FROM Products WHERE (Barcode <> '') ";

    $res = mysql_query($sql);

    while ($rijen = mysql_fetch_assoc($res)) {      
        $GLOBALS['arrBarcodes'][] = $rijen;
    }

    }

每次我们遍历XML(或CSV)文件时,我们都要检查数组中是否存在条形码并返回产品ID。

用于搜索功能:

  

$ ProductId = SearchBarcodeProduct($ EanNr,'Barcode');

然而功能:

    function SearchBarcodeProduct($elem, $field)
{
    $top = sizeof($GLOBALS['arrBarcodes']) - 1;
    $bottom = 0;

    $ProductId = 0;

    while($bottom <= $top)
    {
        if($GLOBALS['arrBarcodes'][$bottom][$field] == $elem) {         
            return $GLOBALS['arrBarcodes'][$bottom]['ProductId'];
        }
        else {

            if (is_array($GLOBALS['arrBarcodes'][$bottom][$field])) {
                if (in_multiarray($elem, ($GLOBALS['arrBarcodes'][$bottom][$field]))) {
                    return $GLOBALS['arrBarcodes'][$bottom]['ProductId'];
                }
            }

        }

        $bottom++;
    }        

    return $ProductId;
}

我们填写数组,因为每次我们询问MySQL产品表时都会花费很长时间。

我的问题现在是:

每次循环遍历条形码数组时,仍需要很长时间。对于任何其他解决方案,是否有更快的方式可能与阵列不同? 有人可以帮助我,我在这个愚蠢的事情上工作几周了!

2 个答案:

答案 0 :(得分:0)

为什么需要2个功能?

只试一次

function itemBarcode($id) { 
    $id = intval($id);
    $sql = "SELECT ProductId, Barcode FROM Products WHERE ProductId = $id Barcode <> '') ";

    $res = mysql_query($sql);

    if ($row = mysql_fetch_assoc($res)) {      
        return $row['barcode'];
    } else {
       return 0;
    }
}

更新如果您需要按条形码进行搜索,则可以创建其他功能:

function itemProduct($barcode) { 
    $sql = "SELECT ProductId, Barcode FROM Products WHERE Barcode = $barcode ";
    $res = mysql_query($sql);

    if ($row = mysql_fetch_assoc($res)) {      
        return $row['ProductId'];
    } else {
       return 0;
    }
}

答案 1 :(得分:0)

听起来你错过了数据库中Barcode列的索引。使用可能是唯一的单一索引列的单行查找应该非常快。

CREATE INDEX Barcode_Index ON Products (Barcode)

然后简单地说:

SELECT ProductId FROM Products WHERE Barcode = *INPUT*

如果您将条形码设为NULL,那么您也可以使索引成为UNIQUE,如果有多个这样的条形码,那么这些条形码将是'''。

另一种选择是使用条形码键入你拥有的数组:

while ($rijen = mysql_fetch_assoc($res)) {      
     $GLOBALS['arrBarcodes'][$rijen['Barcode']] = $rijen;
}

甚至只是:

while ($rijen = mysql_fetch_assoc($res)) {      
     $GLOBALS['arrBarcodes'][$rijen['Barcode']] = $rijen['ProductId'];
}

然后你可以直接查找:

$ProductId = isset($GLOBALS['arrBarcodes'][$Barcode])
    ?$GLOBALS['arrBarcodes'][$Barcode]['ProductId']
    :0;

或:

 $ProductId = isset($GLOBALS['arrBarcodes'][$Barcode])
    ?$GLOBALS['arrBarcodes'][$Barcode]
    :0;   

N.B 请阅读有关使用$GLOBALSmysql_query的评论中的警告。

  • 如果需要,请将条形码数组存储在对象或变量中。
  • PDO非常方便,我认为它也可以在fetch上为你修复返回的数组。