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」カウントで私とメモ帳++が得られます) が、そう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

前に述べたように、配列は連想的でso array_key_exists()はなく、文字列に対してチェックすると true を返しません。

あなたのコード'1'では、文字列である と照合しています。1整数であるを使用しないでください。

お役に立てれば。

于 2013-08-07T11:41:31.107 に答える