我们有一个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产品表时都会花费很长时间。
我的问题现在是:
每次循环遍历条形码数组时,仍需要很长时间。对于任何其他解决方案,是否有更快的方式可能与阵列不同? 有人可以帮助我,我在这个愚蠢的事情上工作几周了!
答案 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 请阅读有关使用$GLOBALS
和mysql_query
的评论中的警告。