背景
我有一个数组,我通过根据每次出现的0d0a
using拆分字符串来创建该数组preg_split('/(?<=0d0a)(?!$)/')
。
例如:
$string = "78781110d0a78782220d0a";
将分为:
Array ( [0] => 78781110d0a [1] => 78782220d0a )
有效的数组元素必须以 开头7878
和结尾0d0a
。
问题
但有时,0d0a
字符串中有一个额外的元素,它拆分为一个额外的无效数组元素,即不以 . 开头的元素7878
。
以这个字符串为例:
$string = "78781110d0a2220d0a78783330d0a";
这分为:
Array ( [0] => 78781110d0a [1] => 2220d0a [2] => 78783330d0a )
但实际上应该是:
Array ( [0] => 78781110d0a2220d0a [1] => 78783330d0a)
我的解决方案
我编写了以下(混乱的)代码来解决这个问题:
$data = Array('78781110d0a','2220d0a','78783330d0a');
$i = 0; //count for $data array;
$j = 0; //count for $dataFixed array;
$dataFixed = $data;
foreach($data as $packet) {
if (substr($packet,0,4) != "7878") { //if packet doesn't start with 7878, do some fixing
if ($i != 0) { //its the first packet, can't help it!
$j++;
if ((substr(strtolower($packet), -4, 4) == "0d0a")) { //if the packet doesn't end with 0d0a, its 'mostly' not valid, so discard it
$dataFixed[$i-$j] = $dataFixed[$i-$j] . $packet;
}
unset($dataFixed[$i-$j+1]);
$dataFixed = array_values($dataFixed);
}
}
$i++;
}
描述
我首先将数组复制到另一个数组$dataFixed
。在数组的foreach
循环中$data
,我检查它是否以7878
. 如果没有,我将它与$data
. 然后我取消设置当前数组$dataFixed
并使用 重置数组元素array_values
。
但我对这个解决方案不是很有信心。有没有更好、更有效的方法?
更新
如果输入字符串没有0d0a
像它应该的那样结束怎么办?它将坚持前一个数组元素..
例如:在字符串78781110d0a2220d0a78783330d0a0000
中,0000
应作为另一个数组元素分隔。