2005-08-29

Ruby と PHP の配列操作比較

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

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

RubyPHP
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() を使えばうまくやれそう。 

About

例によって個人のなんちゃらです