首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多关联数组中插入值时,请注意:未定义的偏移量1

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

Stack Overflow用户
提问于 2013-08-06 23:42:16
回答 3查看 644关注 0票数 0

这就是代码:

代码语言:javascript
复制
$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,这是一个标准时间模式。

EN

回答 3

Stack Overflow用户

发布于 2013-08-06 23:44:31

$temp2是一个列表,而不是关联数组。你不应该使用array_key_exists

由于explode不可能返回稀疏数组或关联数组,因此一个简单的count($temp2)就足够了。

您希望对关联数组使用array_key_exists

代码语言:javascript
复制
$arr = array(
    "foo" => "bar",
    "ipsum" => "lorem"
);
var_dump(array_key_exists("foo", $arr)); // true
var_dump(array_key_exists("bar", $arr)); // false

如果您的数组是一个列表,则可以使用count

代码语言:javascript
复制
$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
EN

Stack Overflow用户

发布于 2013-08-07 19:41:31

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

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

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2013-08-09 02:05:41

我想我找到问题所在了。让我们看看下面的代码:

代码语言:javascript
复制
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>"); }
    }
}

它输出以下内容:

代码语言:javascript
复制
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"的行设置检查条件

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18084645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档