[PHP-users 19786]連想配列中の任意の位置に要素を挿入

Kentaro Ishitoya isitoya @ wakhok.ac.jp
2004年 1月 8日 (木) 21:42:33 JST


こんばんは、初めまして石戸谷と申します。
今まで、皆様の投稿を読ませていただくだけでしたが、壁にぶつかったので投稿させ
ていただきます。

「[PHP-users 19689]配列の任意の位置への要素の挿入」にて、
> $input = array("red" => "red1", "green" => "green1",
>                "blue" => "blue1", "yellow" => "yellow1");
> $input = array_merge( array_slice($input, 0, 1),
>                       array("black" => "black1"),
>                       array_slice($input, 1) );
のような関数が出てきましたが、これらの配列をちょん切る関数は引数として「配列
の先頭からの位置」を必要としますよね。
これを配列のキーから取得できるような関数、あるいはその要素が配列の中でどの位
置にあるかわかるような値などはあるのでしょうか。

なぜこのようなことをしたいのかというと
ex1)
$array["a"] = new Hoge("a");
$array["b"] = new Hoge("b");
$array["c"] = new Hoge("c");
$array["d"] = new Hoge("d");
とあった時に、$array["c"]のあとに要素を挿入したいときに、どうすればよいのか
わからなくなってしまったのです。
もし、$array["b"]が先頭から2番目の要素であるということを仮定すればいいのです
が、もし、krsort($array)などをした場合"b"の位置がわからなくなってしまいま
す。
というわけで下記のような関数をつくり、テストしてみたのですが処理が少なければ
問題ない速さなのですが、回数がかさむと遅くなってしまいます。
もし、連想配列中の位置がキーからすぐに取得できれば定時間で終わる処理だと思う
のですが。
できるできない含めてご教示ください。よろしくお願いいたします。

<?php
for($i = 0; $i < 1000000; $i++){
    $array["$i"] = $i;
}
$start = getmicrotime();
insert_after($array, 1000, "after");
$end = getmicrotime();
echo $end - $start;


function insert_after(&$array, $after, $data){
    $i = 0;
    foreach($array as $key => $node){
        if($key === $after){
            return;
        }
        $i++;
    }
}
function array_insert(&$array, $value, $pos)
{
    if (!is_array($array))
      return FALSE;

    $last = array_splice($array, $pos);

    array_push($array, $value);
    $array = array_merge($array, $last);
}

function getmicrotime()
{
    list($usec, $sec) = explode(' ',microtime());
    return ((float)$sec + (float)$usec);
}
?>

insert_afterの第二引数 : かかった時間
10     : 0.000235080718994
100    : 0.000602006912231
1000   : 0.00405204296112
10000  : 0.0422959327698
100000 : 0.424423933029




PHP-users メーリングリストの案内