簡體   English   中英

PHP:基於數組拆分字符串

[英]PHP: split string based on array

以下是我要解析的數據:

50‐59 1High300.00 Avg300.00
90‐99 11High222.00 Avg188.73
120‐1293High204.00 Avg169.33

第一部分是權重范圍,接下來是計數,然后是Highprice ,以Avgprice結尾。

例如,我需要將上面的數據解析成一個數組,看起來像

[0]50-59
[1]1
[2]High300.00
[3]Avg300.00

[0]90-99
[1]11
[2]High222.00
[3]Avg188.73

[0]120‐129
[1]3
[2]High204.00
[3]Avg169.33

我考慮過創建一個可能的權重范圍的數組,但我不知道如何使用數組的值來拆分字符串。

$arr = array("10-19","20-29","30-39","40-49","50-59","60-69","70-79","80-89","90-99","100-109","110-119","120-129","130-139","140-149","150-159","160-169","170-179","180-189","190-199","200-209","210-219","220-229","230-239","240-249","250-259","260-269","270-279","280-289","290-299","300-309");

任何想法將不勝感激。

希望這會奏效:

    $string='50-59 1High300.00 Avg300.00
    90-99 11High222.00 Avg188.73
    120-129 3High204.00 Avg169.33';

    $requiredData=array();
    $dataArray=explode("\n",$string);
    $counter=0;
    foreach($dataArray as $data)
    {
        if(preg_match('#^([\d]+\-[\d]+) ([\d]+)([a-zA-Z]+[\d\.]+) ([a-zA-Z]+[\d\.]+)#', $data,$matches))    
        {
            $requiredData[$counter][]=$matches[1];
            $requiredData[$counter][]=$matches[2];
            $requiredData[$counter][]=$matches[3];
            $requiredData[$counter][]=$matches[4];
            $counter++;
        }
    }
    print_r($requiredData);
'#^([\d]+\-[\d]+) ([\d]+)([a-zA-Z]+[\d\.]+) ([a-zA-Z]+[\d\.]+)#'

我認為這不會起作用,因為您在正則表達式中的重量和計數之間有空間。 我正在努力解決的問題是像這樣沒有空間的一排。 120‐1293High204.00 Avg169.33需要解析為[0]120‐129 [1]3 [2]High204.00 [3]Avg169.33

你說的對。 這可以通過將重量位數限制為三個並使空格可選來解決。

'#^(\d+-\d{1,3}) *…

$arr = array('50-59 1High300.00 Avg300.00', 
             '90-99 11High222.00 Avg188.73', 
             '120-129 3High204.00 Avg169.33');

foreach($arr as $str) {
    if (preg_match('/^(\d+-\d{1,3})\s*(\d+)(High\d+\.\d\d) (Avg\d+\.\d\d)/i', $str, $m)) {
        array_shift($m); //remove group 0 (ie. the whole match)
        $result[] = $m;
    }
}
print_r($result);

輸出:

Array
(
    [0] => Array
        (
            [0] => 50-59
            [1] => 1
            [2] => High300.00
            [3] => Avg300.00
        )

    [1] => Array
        (
            [0] => 90-99
            [1] => 11
            [2] => High222.00
            [3] => Avg188.73
        )

    [2] => Array
        (
            [0] => 120-129
            [1] => 3
            [2] => High204.00
            [3] => Avg169.33
        )

)

解釋:

/                   : regex delimiter
    ^               : begining of string
    (               : start group 1
      \d+-\d{1,3}   : 1 or more digits a dash and 1 upto 3 digits ie. weight range
    )               : end group 1
    \s*             : 0 or more space character
    (\d+)           : group 2 ie. count
    (High\d+\.\d\d) : group 3 literal High followed by price
    (Avg\d+\.\d\d)  : Group 4 literal Avg followed by price
/i                  : regex delimiter and case Insensitive modifier.

為了更通用,您可以將HighAvg替換為[az]+

這是您可以信任的模式(模式演示):

/^((\d{0,2})0‐(?:\2)9) ?(\d{1,3})High(\d{1,3}\.\d{2}) ?Avg(\d{1,3}\.\d{2})/m

其他答案忽略了weight range子字符串中的數字模式。 范圍起始整數始終以0結尾,范圍結束整數始終以9結尾; 范圍總是跨越十個整數。

我的模式將捕獲起始整數中0之前的數字,並在破折號后立即引用它們,然后要求捕獲的數字后跟9

我想指出您的示例輸入有點棘手,因為您的不是標准-介於我鍵盤上的0=之間。 這是我要解決的一個鬼鬼祟祟的小問題。

方法(演示):

$text = '50‐59 1High300.00 Avg300.00
90‐99 11High222.00Avg188.73
120‐1293High204.00 Avg169.33';

preg_match_all(
    '/^((\d{0,2})0‐(?:\2)9) ?(\d{1,3})High(\d{1,3}\.\d{2}) ?Avg(\d{1,3}\.\d{2})/m',
    $text,
    $matches,
    PREG_SET_ORDER
);

var_export(
    array_map(
        fn($captured) => [
            'weight range' => $captured[1],
            'count' => $captured[3],
            'Highprice' => $captured[4],
            'Avgprice' => $captured[5]
        ],
        $matches
    )
);

輸出:

array (
  0 => 
  array (
    'weight range' => '50‐59',
    'count' => '1',
    'Highprice' => '300.00',
    'Avgprice' => '300.00',
  ),
  1 => 
  array (
    'weight range' => '50‐59',
    'count' => '1',
    'Highprice' => '300.00',
    'Avgprice' => '300.00',
  ),
  2 => 
  array (
    'weight range' => '50‐59',
    'count' => '1',
    'Highprice' => '300.00',
    'Avgprice' => '300.00',
  ),
  3 => 
  array (
    'weight range' => '50‐59',
    'count' => '1',
    'Highprice' => '300.00',
    'Avgprice' => '300.00',
  ),
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM