全然違うような

これ全然JavaScriptのindexOfと関係ないんじゃないですか?

PHPJavaScriptにあるindexOf関数を実装するコードスニペットが公開されてます。

<?php

function indexOf($needle, $haystack) {
        for ($i=0;$i<count($haystack);$i++) {
                if ($haystack[$i] == $needle) { 
                        return $i;
                }
        }
        return false;
}
?>

とりあえず適当なサイトを探して引用.

■文字列の検索
文字列の検索は indexOf と lastIndexOf で行います。
indexOf は前から、 lastIndexOf は後から検索し、 検索された文字列の場所を charAt と同じ数え方で返します。
str.indexOf(searchstring, [index])で、 indexから searchstring を検索し最初に見つかった場所を返します。

str1 = "0123456789012345678901234";
pos1 = str1.indexOf("1"); // 1
pos2 = str1.lastIndexOf("1"); // 21
pos3 = str1.indexOf("123", 2); // 11
pos4 = str1.lastIndexOf("123", 2); // 1

以下、特殊な場合:

str1 = "0123456789012345678901234";
pos5 = str1.indexOf("a"); // -1
pos6 = str1.indexOf("1", -1); // 1
pos7 = str1.lastIndexOf("1", -1); // -1
pos8 = str1.indexOf("1", 50); // -1
pos9 = str1.lastIndexOf("1", 50); // 21

そう.全然違うんです.

- JavaScriptのindexOf phpspotの紹介のindexOf
対象とする型 文字列 配列
範囲 文字列(上記で言うsearchstring)の一部 配列要素の値全体
追加機能 オフセット位置の指定ができる ない
補足 - array_search()で同じことができる

PHPスクリプトとしても下記が不十分です

  • 配列要素を数字でしか舐めないため,連想配列に使えない(こういうのはarray_keysとforeachなどじゃないですか?)
foreach ( array_keys( $foo) as $name) {
    $val = $foo[ $name];
}
  • forの中にcountがあるため,パフォーマンスが著しく落ちる(PHP 5.1.4,アクセラレーターなし.10回程度やっておおよそ近い数字)他にもいろいろ動いているので,誤差はある程度出てしまっていますが,count()を外に出すかどうかで場合によっては200%近くパフォーマンスに差が出ることに注目.
$ time php -dmemory_limit=256M -r '
  $foo = array_fill( 0, 2000000, 0);
  for ( $i = 0; $i < count( $foo); ++$i) { ++$foo[ $i];}'

real    0m2.767s
user    0m2.340s
sys     0m0.428s
$ time php -dmemory_limit=256M -r '
  $foo = array_fill( 0, 2000000, 0);
  $counts = count( $foo);
  for ( $i = 0; $i < $counts; ++$i) { ++$foo[ $i];}'

real    0m1.724s
user    0m1.364s
sys     0m0.360s

総括として

  • JavaScriptのindexOfと全然関係ない間違った記事
  • サンプルもPHP 4.0.5から使用できるarray_search()で代用できる.サンプルとしてもちょっとつらい.