独学者Fossa

独学していることなど

PHP array_merge()

まえがき

UIKitlessファイルをscssに変換するCLI Applicationを作成して、気づいた事があります。

文字列を置き換える為に、lessファイルをfile()関数で読み込んで、配列で処理しています。1

@useから始まる文4行分を、約1000行あるファイルの先頭に追加する必要がありました。

配列を追加する場合、array_merge()関数があります。

他にも、array_push()関数など、結果的に同じような処理が出来る方法がないか、調べてみました。

使用環境

Name Version
PHP v8.4.7
Laravel Zero 11.x
FrankenPHP 1.6.2

本題

先頭に追加したい4行分が$addという変数に、配列で入っています。

1000行分は$arrayという変数に、配列で入っています。

Info
かかった時間は、file()関数で約1000行分読んだ時間も含まれるので、参考値です。
関数の優劣や速さの違いを保証する記事では、ありません。

A.array_merge()

    return array_merge($add, $array);

B.array_push()

    array_push($add, ...$array);

    return $add;

C.DS\Vector

    $vector = new \DS\Vector($add);

    return $vector->merge($array)->toArray();

D.スプレッド構文

    return [...$add, ...$array];

E.implode() + 結合代入演算子

    $contents = implode('', $array);
    $prepend = implode('', $add);
    $prepend .= $contents;

    return $prepend;

配列要素を文字列にして、文字列を追加しますが、処理の最後にfile_put_contents()関数を使うので、結果は同じになります。

あとがき

ベンチマークを見ると、100回とか繰り返している場合があります。

array_merge()を、100回繰り返す必要あるのでしょうか?

今回の場合、必要ないと考えました。

UIKitのコンポーネントは、約60あるので、少しでも速くしたいと思って、試してみました。

配列結合演算子という方法もありますが、今回は該当しないはずです。

途中経過で、今の時点では何とも言えませんが、文字列で処理した場合、preg_match_all()関数を使うからか、配列で処理する場合と、そんなに変わらないような気がします。

FrankenPHP

DS\Vectorは、peclでインストールしているので、そのままでは動かないみたいです。

php-cli FrankenPHP
A 0.389978ミリ秒 0.246035ミリ秒
B 0.619905ミリ秒 0.207205ミリ秒
C 0.307179ミリ秒 no data
D 0.227177ミリ秒 0.166017ミリ秒
E 0.244699ミリ秒 0.193126ミリ秒

  1. 文字列全体の置換より、一行の方が、正規表現が書きやすいような気がする(私にとって正規表現は難しい)