这就是代码:
$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,这是一个非常时间的模式。
答案 0 :(得分:1)
$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];
答案 1 :(得分:0)
如前所述,您的数组不是关联的,如果检查字符串,so array_key_exists()
将不会返回true。
在您的代码中,您将与'1'
匹配,这是一个字符串。你不应该使用1
,这是一个整数吗?
希望这有帮助。
答案 2 :(得分:0)
我想我发现了问题所在。让我们看看以下代码:
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()
函数更改为从第4个元素($temp[3]
)读取,但是这可以读取其他读取的行,这个数字早于数字(我的第一个双倍空间) line是#20266,但现在是#29)。这意味着我们需要为具有两个空格和/或"\t"
s
当前的心态:沮丧,我认为一些新的“特征”很快就会出现:(