1
0

PHPの標準関数をRubyで書く(配列操作編)

Last updated at Posted at 2021-03-30

はじめに

PHPの標準関数をRubyで書いてみました。
簡単に書けそうなものだけパズル感覚で書いてます。

配列操作編です。

PHPの添字配列はArray、連想配列はHashに対応させました。
特に差し支えなさそうなケースでは他の型でも許容としています。(返り値がEnumeratorになる等)

引数と返り値の型はテーブルで記載しました。

array_chunk($array, $chunk)

PHP: array_chunk - Manual

array Array
chunk Integer
return Enumerator
Ruby
array.each_slice(chunk)
array Hash
chunk Integer
return Hash
Ruby
array.each_slice(chunk).map(&:to_h)

array_column($array, $column_key)

PHP: array_column - Manual

array Array<Array | Hash>
column_key untyped
return Enumerator
Ruby
array.map { |v| v[column_key] }
array Hash<untyped, Array | Hash>
column_key untyped
return Hash
Ruby
array.transform_values { |v| v[column_key] }

array_combine($keys, $values)

PHP: array_combine - Manual

keys Array
values Array
return Hash
Ruby
keys.zip(values).to_h

array_count_values($array)

PHP: array_count_values - Manual

array Array
return Hash
Ruby
array.tally
array Hash
return Hash
Ruby
array.values.tally

array_diff($array, ...$arrays )

PHP: array_diff - Manual

※入力がArrayのケースは省略。返り値のindexが振り直されず飛び飛びになる為。

array Hash
arrays Array<Hash>
return Hash
Ruby
array.filter { |_, v| arrays.flat_map(&:values).none? { |vv| v == vv } }

array_fill_keys($keys, $value)

PHP: array_fill_keys - Manual

keys Array
value untyped
return Hash
Ruby
keys.zip([value].cycle).to_h

array_fill($start_index, $count, $value)

PHP: array_fill - Manual

start_index 0
count Integer
value untyped
return Array
Ruby
[value] * count
start_index Integer ※0以上
count Integer
value untyped
return Hash
Ruby
(start_index..).take(count).zip([value].cycle).to_h

array_filter($array, $callback, $mode)

PHP: array_filter - Manual

※入力がArrayのケースは省略。返り値のindexが振り直されず飛び飛びになる為。

array Hash
callback Proc
mode ARRAY_FILTER_USE_BOTH
return Hash
Ruby
array.filter { |k, v| callback.(v, k) }

array_flip($array)

PHP: array_flip - Manual

array Array
return Hash
Ruby
array.map.with_index.to_h
array Hash
return Hash
array.invert

array_intersect($array, ...$arrays)

PHP: array_intersect - Manual

※入力がArrayのケースは省略。返り値のindexが振り直されず飛び飛びになる為。

array Hash
array Array<Hash>
return Hash
Ruby
array.filter { |_, v| arrays.flat_map(&:values).any? { |vv| v == vv } }

array_key_exists($key, $array)

PHP: array_key_exists - Manual

key Integer
array Array
return TrueClass | FalseClass
Ruby
array.each_index.include?(key)
key Integer
array Hash
return TrueClass | FalseClass
Ruby
array.key?(key)

array_key_first($array)

PHP: array_key_first - Manual

array Array
return Integer
Ruby
0
array Hash
return untyped
Ruby
array.keys.first

array_key_last($array)

PHP: array_key_last - Manual

array Array
return Integer
Ruby
array.count.pred
array Hash
return untyped
Ruby
array.keys.last

array_keys($array)

PHP: array_keys - Manual

array Array
return Enumerator
Ruby
array.each_index
array Hash
return Array
Ruby
array.keys

array_map($callback, $array, ...$arrays)

PHP: array_map - Manual

callback Proc
array Array
arrays Array<Array>
return Enumerator
Ruby
array.zip(*arrays).map(&callback)
callback Proc
array Hash
arrays Array<Hash>
return Enumerator
Ruby
array.values.zip(*arrays.map(&:values)).map(&callback)

array_merge(...$arrays)

PHP: array_merge - Manual

arrays Array<Array>
return Array
Ruby
arrays.inject(:+)
arrays Array<Hash>
return Hash
Ruby
arrays.inject(:merge)

array_pad($array, $length, $value)

PHP: array_pad - Manual

array Array
length Integer ※0以上
value untyped
return Array
Ruby
array + [value] * [length - array.count, 0].max
array Array
length Integer ※0未満
value untyped
return Array
Ruby
[value] * [-length - array.count, 0].max + array

array_pop($array)

PHP: array_pop - Manual

array Array
return untyped
Ruby
array.pop
array Hash
return untyped
Ruby
array.delete(array.keys.last)

array_product($array)

PHP: array_product - Manual

array Array<Integer | Float>
return Integer | Float
Ruby
array.inject(:*)

array_push(&$array, ...$values)

PHP: array_push - Manual

array Array
values untyped
return Array
Ruby
array.push(*values)

array_rand($array, $num)

PHP: array_rand - Manual

array Array
num Integer
return Array
Ruby
array.each_index.to_a.sample(num).sort
array Hash
num Integer
return Array
Ruby
array.keys.sample(num).sort_by { |v| array.keys.index(v) }

array_reduce($array, $callback, $initial)

PHP: array_reduce - Manual

array Array
callback Proc
initial untyped
return untyped
Ruby
array.inject(initial, &callback)
array Hash
callback Proc
initial untyped
return untyped
Ruby
array.values.inject(initial, &callback)

array_reverse($array, $preserve_key)

PHP: array_reverse - Manual

array Array
preserve_key FalseClass
return Enumerator
Ruby
array.reverse
array Hash
preserve_key TrueClass
return Hash
Ruby
array.reverse_each.to_h

array_search($needle, $haystack, $strict)

PHP: array_search - Manual

needle untyped
haystack Array
strict ※言語仕様が違うので省略
return Integer
Ruby
haystack.index(needle)
needle untyped
haystack Hash
strict ※言語仕様が違うので省略
return untyped
Ruby
haystack.key(needle)

array_shift(&$array)

PHP: array_shift - Manual

array Array
return untyped
Ruby
array.shift
array Hash
return untyped
Ruby
array.shift.then { |v| array.empty? ? v : v.last }

array_slice($array, $offset, $length, $preserve_keys)

PHP: array_slice - Manual

array Array
offset Integer
length Integer ※0以上
preserve_keys FalseClass
return Array
Ruby
array[offset, length]
array Hash
offset Integer
length Integer ※0以上
preserve_keys TrueClass
return Hash
Ruby
array.slice(*array.keys[offset, length])

array_sum($array)

PHP: array_sum - Manual

array Array
return Integer | Float
Ruby
array.sum
array Hash
return Integer | Float
Ruby
array.values.sum

array_unique($array, $flags)

PHP: array_unique - Manual

array Array
flags ※ソート機能はないものとして省略
return Array
Ruby
array.uniq

※重複した要素は前の要素が残る(PHPのarray_uniqueと同様)

array Hash
flags ※ソート機能はないものとして省略
return Hash
Ruby
array.invert.invert

※重複した要素は後の要素が残る(前を残すならreverse_eachを挟む)

array_unshift(&$array, ...$values)

PHP: array_unshift - Manual

array Array
return Integer
Ruby
(array = array.unshift(*values)).count

array_values($array)

PHP: array_values - Manual

array Hash
return Array
Ruby
array.values

array_walk(&$array, $callback, $userdata)

PHP: array_walk - Manual

array Array
callback Proc
userdata untyped
return TrueClass
Ruby
true | array.each_with_index(&->(*vs){ vs << userdata } >> callback)
array Hash
callback Proc
userdata untyped
return TrueClass
Ruby
true | array.each(&->(kv){ kv.reverse << userdata } >> callback)

in_array($needle, $haystack, $strict)

PHP: in_array - Manual

needle untyped
haystack Array
strict ※言語仕様が違うので省略
Ruby
haystack.include?(needle)
needle untyped
haystack Hash
strict ※言語仕様が違うので省略
Ruby
haystack.value?(needle)

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0