'注意:在多关联数组中插入值时,未定义的偏移量1'

时间:2013-08-06 15:42:16

标签: php arrays explode fgets

这就是代码:

$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,这是一个非常时间的模式。

3 个答案:

答案 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

的行设置检查条件

当前的心态:沮丧,我认为一些新的“特征”很快就会出现:(