我遇到了一个复杂的问题。在工作中,我们必须每月计算我们的库存。这是通过扫描仪完成的。每个地点最多可以有100种不同的物品。必须扫描每个项目,甚至是同一类。扫描完每个位置后,我们会打印出已扫描的项目列表。问题是每个扫描在txt文件中都有自己的行(它没有添加/减去同一项的多个计数)
由于我们系统的供应商在执行新功能方面出了名的慢,我想到了一个执行以下操作的PHP脚本:
txt文件如下:
01234+000001N
前5位数是项目编号。由于可以添加和减去下一个符号是+或 - 然后接下来的5位是计数,N是" eol"
所以不知怎的,我必须将它全部放在某种数组中并按项目编号排序。然后添加/减去最后打印出最终列表
答案 0 :(得分:0)
假设您已将文件逐行加载到字符串中,并按新行拆分,则可以执行以下操作: (阅读代码评论)
$strTxtFile = <<<TXT
01234+000001N
01234+000001N
09876+000002N
01234+000001N
01234+000001N
09876+000002N
01234-000001N
09876+000002N
TXT;
/**
* 01234 should have 3 stock
* 09876 should have 6 stock
*/
$arrProducts = array();
$arrFileLines = explode(PHP_EOL, $strTxtFile);
foreach($arrFileLines as $strFileLine) {
//Split the lines by the action (+/-)
$arrStockAction = preg_split("/(\+|\-)/", $strFileLine, NULL, PREG_SPLIT_DELIM_CAPTURE);
$strProductCode = $arrStockAction[0]; //The first part is the product code
$strAction = $arrStockAction[1]; //The action (+/-) to the stock
$intStockAmount = (int) $arrStockAction[2]; //Cast it to an int to get the number
//Check if the product exists in our array, if not, create it with 0 stock
if( array_key_exists($strProductCode, $arrProducts) === FALSE ) {
$arrProducts[$strProductCode] = 0;
}
if($strAction === "+") {
//Add stock
$arrProducts[$strProductCode] += $intStockAmount;
} else {
//Minus stock
$arrProducts[$strProductCode] -= $intStockAmount;
}
}
print_r($arrProducts);
答案 1 :(得分:0)
与其他答案类似,可能更简单一点:
foreach(file('/path/to/file.txt') as $line) {
$item = substr($line, 0, 5);
$sign = substr($line, 5, 1);
$qty = substr($line, 6, 6);
if(!isset($result[$item])) {
$result[$item] = $qty;
} else {
$result[$item] += $sign.$qty;
}
}
或者将substr()
行替换为:
preg_match('/(\d{5})(.)(\d{6})/', $line, $matches);
并使用$matches[1]
,$matches[2]
和$matches[3]
。
答案 2 :(得分:0)
我刚发现我误读了txt文件。这些行如下:
01234000001 N
和
01234000001-N
最后一个数字和N之间的空格表示加法和 - substract