0

那是代码:

$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 日志文件)的时间。旁边的 blablamystring是 nn:nn:nn,这是一种标准时间模式。

4

3 回答 3

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];
于 2013-08-06T15:44:31.447 回答
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])。"\t"这意味着我们需要为带有两个空格和/或s的行设置检查条件

目前的心态:沮丧,我认为一些新的“功能”很快就会出现:(

于 2013-08-08T18:05:40.597 回答
0

如前所述,您的数组不是关联的,so array_key_exists()如果检查字符串,则不会返回 true。

在您的代码中,您匹配'1'的是一个字符串。你不应该使用1, 这是一个整数吗?

希望这可以帮助。

于 2013-08-07T11:41:31.107 回答