所以我对PHP非常新鲜 - 就像这是我第一次潜入它!
我正在做的是尝试获取从表单传入的字符串并用分隔符解析它。我目前正在使用' - '作为分隔符。如果输入了我正在寻找的项目,则其中一个项目将有一个整数值。
基本上我正在寻找的有效字符串将采用以下形式:
-QUANTITY-SKU-TITLE-PRICE
SKU,标题和价格保证填写,但数量不是。 所以我可以收到格式为
的字符串-20-SKU:5563-产品A-Price:$ 19.95
或者
- SKU:5563-产品A-Price:$ 19.95
如果特定产品没有实际订购(即没有实际订购的数量)。 这些字符串也是串联传递的,所以我试图使用' - '作为我的分隔符,并且如果遇到一个数字(只有字符串的QUANTITY部分应该匹配),我将返回一个包含该字符串的字符串需要的数据。
问题是ctype_digit
永远不会评估为真?
public function display_entry_cp ($data)
{
$process_product = explode("-", $data);
$return_array = "Products ordered:\n";
//print_r($process_product);
for ($i = 0; $i < count($process_product); ++$i) {
// echo($process_product[$i] . "<br/>");
if($process_product[$i] != '' && ctype_digit($process_product[$i])){
echo("Element is digit!");
// look for the first int seen, that is our quantity, next is SKU, Title then Price
$ordered_product = 'Quantity: ' . $process_product[$i] . ' ' . $process_product[++$i] . ' ' . $process_product[++$i] . ' ' . $process_product[++$i];
$return_array = $ordered_product;
}
}
return $return_array;
}
当回应$process_product[$i]
我看到了我的期望时,如果输入了QUANTITY,就无法弄清楚如何只插入一个项目?
如果打印出来的示例如下:
133
SKU: 1101
Description: Product A
Price: $8.95
SKU: 1200
Description: Product B
Price: $9.50
SKU: 1105
Description: Product C
Price: $17.95
133
SKU: 910
Description: Product D
Price: $19.95
在此示例中,返回的字符串如下所示:
-133-SKU:1101-产品说明:产品A:8.95美元 - SKU:1200-产品说明:产品B-Price:$ 9.50 - SKU:1105-产品说明:产品C-Price:$ 17.95-133-SKU:910 - 描述:产品D:19.95美元
在这个例子中,我只想返回第一个项目和最后一个项目。
答案 0 :(得分:0)
我看了很久。您作为样本提供的数据与规范不匹配 - 也就是说,记录开头应该有两个相邻的连字符,没有数量,但您的数据只有一个。您的代码没有处理,因此您的后续令牌不符合预期,因此您的情况会失败。
如果添加缺少的连字符,则此代码可以正常工作。
有一个不同的问题。在组装$order_product
字符串时会出现另一个问题。您在每个术语上递增循环索引变量。这有点好(但实际上很糟糕,因为以后会让人感到困惑),除了你有一个短记录,索引增加超过数组中元素的数量。
程序员使用字段和记录分隔符是有原因的:它可以可靠地处理这种差异。已有一个很好的格式:CSV很容易理解和可靠。
但是,你说这些数据来自一个表格。如果是这样,它必须出现在某个地方的$_GET
或$_POST
变量中。不知何故,大概是,您已将数据混合成这种专有格式,以便在其上运行此例程。我不得不问:为什么?
这是一个经典的 xy 问题。你问了一件事,但你真的应该问别的事情。在这种情况下,我猜,PHP中的表单处理
答案 1 :(得分:0)
所以我认为我已经提出了一个解决方案 - 因为我不是专家,我想知道这是否比我上面的方法更“好”?
public function display_entry_cp ($data)
{
/*
* Precondition: String comes in the format:
* "SKU/DESCR/PRICE/QTY,SKU/DESCR/PRICE/,SKU/DESCR/PRICE/QTY," ...etc
* QTY may or may not be an empty string - this is our indicator that item was ordered
*/
// First get all the products into single lines we can work with
$process_product = explode(",", $data);
// String to hold our return value
$return_str = "Products ordered:";
// Loop through and process the extracted strings
foreach($process_product as $value) {
// Testing
//echo($value . "<br/>");
try{
// Split the string by the "/" delimiter
$explode = explode("/", $value);
// Count should always be 4, even if no QTY entered, it will contain " "
if(count($explode) == 4){
list($sku, $descr, $price, $qty) = explode("/", $value);
// Checking if there really is a QTY
if (trim($qty) !== "") {
//echo(" SKU: " . $sku . " Description: " . $descr . " Price: $" . $price . " Qty: " . $qty . "<br/>");
$ordered_product = (" SKU: " . $sku . " Description: " . $descr . " Price: $" . $price . " Qty: " . $qty);
//echo($ordered_product);
$return_str .= $ordered_product;
}
}
}
catch (Exception $e){
log_message('error', $e->getMessage());
return;
} // end try/catch
}// end foreach
// Final check to see if return_str is what we expect
//echo($return_str);
return $return_str;
}
正如评论中所提到的,字符串现在将采用以下格式:
“SKU / DESCR / PRICE / QTY,SKU / DESCR / PRICE /,SKU / DESCR / PRICE / QTY,”......等等
QTY可能是空的,也可能不是。在任何一种情况下,它都将包含前面的空格(“”)字符。 现在我可以用逗号(“,”)分隔,首先将所有产品都放到自己的字符串中。从那里,我可以进一步将字符串分成单独的组件。这也使我能够使用“foreach()”循环作为“for()”循环。
如果您发现任何问题,请与我们联系。