这就是代码:
$myarray = ['asdf' => array(), 'zxcv' => array()];
while (!feof($file))
{
$line = fgets($file);
if (strpos($line, "mystring")
{
$temp = explode(" ", $line);
$temp2 = explode(":", $temp[2]);
if (array_key_exists('1', $temp2))
{
$myarray['asdf'][] = "1";
}
}
}只有在解析大型文件(2mil+行)时才会出现问题。转储数组表明值在那里(相同的"mystring“计数给出了我和Notepad++),但是这个通知看起来像是array_key_exists()返回了false,而实际上不是。有什么想法吗?
我的目标的简要说明:文件中的行具有以下结构- blabla mystring blabla blabla,最多20个空格分隔符。准确地说,mystring是DHCPOFFER。在我的例子中,我尝试在数组中插入满足条件的时间,并将行添加到日志文件(isc-dhcpd日志文件)。mystring旁边的blabla是nn:nn:nn,这是一个标准时间模式。
发布于 2013-08-06 23:44:31
$temp2是一个列表,而不是关联数组。你不应该使用array_key_exists。
由于explode不可能返回稀疏数组或关联数组,因此一个简单的count($temp2)就足够了。
您希望对关联数组使用array_key_exists:
$arr = array(
"foo" => "bar",
"ipsum" => "lorem"
);
var_dump(array_key_exists("foo", $arr)); // true
var_dump(array_key_exists("bar", $arr)); // false如果您的数组是一个列表,则可以使用count
$arr = array("one", "two", "three");
var_dump(count($arr) > 2); // true, ok so we can do $arr[2];
var_dump(count($arr) > 5); // false, ok so we can't do $arr[5];发布于 2013-08-07 19:41:31
如前所述,您的数组是非关联的,如果检查字符串,so array_key_exists()将不会返回true。
在您的代码中,您将匹配'1',它是一个字符串。你不应该使用1,它是一个整数吗?
希望这能有所帮助。
发布于 2013-08-09 02:05:41
我想我找到问题所在了。让我们看看下面的代码:
while (!feof($file))
{
$line = fgets($file, 4096);
$counters['linecount']++;
for ($elem = 0; $elem < 4; $elem++)
{
if (strpos($line, $searchitem[$elem]) !== FALSE)
{
$line2 = preg_replace("/^ {2}(.*)$/", " ", $line);
//or $line2 = str_replace(" ", " ", $line);
//or $line2 = str_replace("\\t", " ", $line);
$temp = explode(" ", $line2);
$temp2 = explode(":", $temp[3]);
if (isset($temp2[3]))
{
echo "blah";
}
else { die("<pre>" . print_r($temp) . "</pre>"); }
}
}它输出以下内容:
Array ( [0] => Nov [1] => [2] => 1 [3] => 00:00:02 [4] => xxx [5] => dhcpd: [6] => DHCPREQUEST [7] => for [8] => xxx.xxx.xxx.xxx [9] => from [10] => xx:xx:xx:xx:xx:xx [11] => via [12] => vlan1 )看起来第一个explode()函数不能很好地工作(我的观点),它把空字符串元素放在不应该的地方,因此我们需要把第二个explode()函数改为从第四个元素读取($temp[3]),但是这个f*增加了其他被读取的行,更早的时候是explode()(我的第一个双空格行是#20266,但现在是#29)。这意味着我们需要为带有两个空格和/或"\t"的行设置检查条件
目前的心态:沮丧,我想一些新的“功能”很快就会出现:
https://stackoverflow.com/questions/18084645
复制相似问题