[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 メーリングリストの案内