0

我有一个简单的数据格式,如下所示:

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

我究竟做错了什么?

4

1 回答 1

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.

PS似乎没有任何理由在循环中使用引用而不是普通变量,因为您从未分配给引用变量。

于 2013-11-11T17:20:21.383 回答