トップ «前の日記(2005-08-27) 最新 次の日記(2005-08-31)» 編集

2005-08-29 [長年日記]

_ Ruby と PHP の配列操作比較

配列操作の比較表: Ruby, Python, JavaScript, Perl, C++ (いやなブログ)

配列操作の比較表は自分のためにも作ったことはなかったので、別に混乱はしないけど、Ruby の分を残して PHP との比較表を起こしてみた。気づいてないだけでもっと賢く書く方法がありそうな気もするけど、とりあえず出しちゃえ。あ、バージョン書いてなかった。PHP4 です。5 は知らない。(マニュアルも見てない。)

Ruby PHP
a = [1, 2, 3]$a = array(1, 2, 3)
a.lengthsizeof( $a ) or count( $a )
a.empty?empty( $a )
a.push(x)array_push( $a, $x ) or $a[] = $x
a.unshift(x)array_unshift($a, $x )
a.pop()array_pop( $a )
a.shift()array_shift( $a )
a.concat( b )$a = array_merge( $a, $b )
a.clear$a = array()
a.include?(x)in_array( $x, $a )
a.insert(i, x)array_splice( $a, $i, 0, $x )
a.delete(x)
a.delete_at(i)unset($a[$i])*1
a.nitems{}$b = array_count_values( $a ); $b[$x]*2
a.index(x)array_search( $a, $x )
a.first$a[0]
a.lastend( $a )*3
a[i..j] or a.slice(i..j)array_slice( $a, offset[, length] )*4
a[i...j] or a.slice(i...j)
a.sort
a.sort!sort( $a )
a.reversearray_reverse( $a )
a.reverse!$a = array_reverse( $a )
a.uniq!$a = array_unique( $a )
a.join(d)join( d, $a ) or implode( d, $a )
a.eachforeach( $a as $key => $val )

insert は 配列のinsert の情報をいただきました。

delete はなんか関数書かないと無理っぽい。

[2005-08-30 追記]array_push() と [] についてツッコミをいただいたので調べてみた。

<?php
define( 'ACCURACY', 5 );
define( 'TIMES', 5 );
define( 'WAIT', 10000 );

function main() {
  print "[]<br>\n";
  for ( $i = 1; $i <= TIMES; $i++ ) {
    $arr = array();
    $start = get_microtime();
    for ( $j = 1; $j <= WAIT; $j++ ) {
    $arr[] = $j;
    }
    $end = get_microtime();
    putime( bcsub($end, $start, ACCURACY) );
  }

  print "array_push()<br>\n";
  for ( $i = 1; $i <= TIMES; $i++ ) {
    $arr = array();
    $start = get_microtime();
    for ( $j = 1; $j <= WAIT; $j++ ) {
      array_push( $arr, $j );
  }
    $end = get_microtime();
    putime( bcsub($end, $start, ACCURACY) );
  }
}

function get_microtime() {
  list( $msec, $sec ) = split( " ", microtime() );
  return bcadd( $sec, $msec, ACCURACY );
}

function putime( $sec ) {
  $accuracy = (int)ACCURACY - 1;
  $str = "%.".$accuracy."f sec<br>\n";
  printf( $str, $sec );
}

main();
?>

結果はこんな感じ。マシンスペックは Pen!!! 800 MHz + 256MB。

[]
0.0421 sec
0.0415 sec
0.0419 sec
0.0415 sec
0.0416 sec
array_push()
0.0559 sec
0.0563 sec
0.0561 sec
0.0560 sec
0.0557 sec

[] の方が速いですしタイプ量も少ないけど、個人的には PHP 以外にも触っていると「なんか気持ち悪い」感じ。あとパフォーマンス重要という方は

イテレーションのベンチマーク (Harukiからの平面波)

なども参考にされるとよいかと。

[2005-11-10 追記]

本当に今さらんだけど、マニュアルを読んだら PHP の配列は実際には順番づけられたマップで、配列にもハッシュにもキューにも応用が可能って書いてあった。

そうか、PHP の配列、ハッシュ周りの動きがどうにも納得いかなかったのは、そもそもがいわゆるちゃんとした配列やハッシュとして設計されたもんじゃないからか。ループが遅かったのもハッシュのくせになぜか順番が維持できちゃったりするのも、そういうわけか

*1 $i のキーと対応する値がなくなるだけで、詰まらない。

*2 $x は文字列で与える。

*3 内部ポインタが末尾にセットされる

*4 範囲式というものはないんだけど range() を使えばうまくやれそう。

本日のツッコミ(全3件) [ツッコミを入れる]
_ τ (2005-08-29 23:45)

はじめまして。<br>PHPは素人ですが(PukiWikiのプラグインを直したことがある程度)、<br>ぐぐって見付けたPHPのマニュアルによると、<br>http://php.s3.to/man/function.array-push.html<br>> 注意: もし配列に 1 つの要素を加えるために array_push()<br>> を使用するなら、 関数を呼ぶオーバーヘッドがないので、<br>> $array[] = を使用するほうがいいです。<br>とあります、が、どうなんでしょうか?<br>弄ったPukiWikiのプラグインでは割と使われてた記憶があります。

_ TrackBack (2005-08-31 13:24)

http://news.hotphpper.net/archives/173-PHPaeeeeaaee.html<br>HotPHPPER News<br>PHPと他言語の配列操作方法の比較<br>縲後≠繝若≠繧翫′縺<縺磧粤甃絅繝磴峨瓱竇瓱紕粤瓷礇繝磴峨犧紜縺紂聽稾絋繧違↓縺磧粤畩紜縺九稲裙甌薊迚萠菘辷陣紜一曳褂;磧跌邁蒹疂紕跂瓲磧粤畩磧縲<br>縺障◆掌絅繝磴峨甌飜糸瓰磚怨foo[]縲阪→縺紂胛蒹瓱rray_shift礇繝潟

_ TrackBack (2005-08-31 22:08)

http://d.hatena.ne.jp/bobchin/20050831/1125493640<br>bobchinの日記<br>[PHP]配列のinsert<br> ハッシュはできませんが配列であれば array_splice($a, $i, 0, $x) でいけないですかね? deleteもいけるかな? array_splice($a, array_search($a, $x), 1)