我有一个简单的数据格式如下:
stuff/stuff/stuff
一个例子是:
data/test/hello/hello2
为了检索某个数据,可以使用我的解析器,它会尝试执行以下操作:
在data/test/hello/hello2
您想要检索data/test
下的数据(hello
)。我的解析器代码如下:
function getData($data, $pattern)
{
$info = false;
$dataLineArray = explode("\n", $data);
foreach($dataLineArray as &$line)
{
if (strpos($line,$pattern) !== false) {
$lineArray = explode("/", $line);
$patternArray = explode("/", $pattern);
$iteration = 0;
foreach($lineArray as &$lineData)
{
if($patternArray[$iteration] == $lineData)
{
$iteration++;
}
else
{
$info = $lineData;
}
}
}
}
return $info;
}
但是,似乎总是会返回最后一项,在本例中为hello2
:
echo getData("data/test/hello/hello2", "data/test");
给我;
hello2
我做错了什么?
答案 0 :(得分:1)
如果你想要模式之后的第一个元素,请将break
放在循环中:
foreach($lineArray as $lineData)
{
if($patternArray[$iteration] == $lineData)
{
$iteration++;
}
elseif ($iteration == count($patternArray))
{
$info = $lineData;
break;
}
}
我也检查$iteration == count($patternArray)
,以便它不会返回中间元素,例如
/data/foo/test/hello/hello2
将返回hello
而不是foo
。
P.S。似乎没有任何理由在循环中使用引用而不是普通变量,因为您从不分配给引用变量。