标记字符串和检查数字

时间:2014-05-14 02:55:31

标签: php

所以我对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美元

在这个例子中,我只想返回第一个项目和最后一个项目。

2 个答案:

答案 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()”循环。

如果您发现任何问题,请与我们联系。