雑多なブログ

音楽や語学、プログラム関連の話題について書いています

PHPでファイル一覧を取得する方法

PHPでファイル一覧は下記の方法で取得できます。 改めて調べてみると色々な方法がありますね。

  • opendir, readdir
  • scandir
  • DirectoryIterator
  • glob

opendir, readdir

opendirディレクトリハンドルを取得し、readdirディレクトリ内のディレクトリとファイルを取得します。取得するファイルの順番は、ファイルシステムに格納されている順序に依存します。

なお、... がリストに含まれるため、これらを除外する必要があります。

$dh = opendir('.');

if ($dh) {
    while (($file = readdir($dh)) !== false) {
        // `.` や `..` を除外します
        if (in_array($file, ['.', '..'])) continue;

        // ファイル以外は除外します
        if (!is_file($file)) continue;

        $files[] = $file;
    }
    closedir($dh);
}

print_r($files);

scandir

対象パスのファイルとディレクトリのリストを取得します。 リストに ... が含まれるため、これらを除外する必要があります。

$result = scandir('.');
print_r($result);

デフォルトでは、リストはアルファベット順に昇順で並べられます。 異なる並び順にしたい場合は、第二引数に以下のオプションを指定します。

SCANDIR_SORT_DESCENDING ... アルファベットの降順
SCANDIR_SORT_NONE ... ソートせずに出力する

glob

指定したパターンにマッチするファイルやディレクトリのパスを返します。 以下の例では、カレントディレクトリ内の.txtもしくは.pdfに該当するファイルを取得しています。

print_r(glob('*.{txt,pdf}', GLOB_BRACE));

一定のルールで命名されたファイルやフォルダのリストを取得する場合に便利な関数です。なお、マッチしたパスのリストを一度にまとめて取得するため、ファイルやフォルダの数が多い場合は、 DirectoryIterator を使うと良いでしょう。

DirectoryIterator

対象パス内のファイルとフォルダのリストをイテレーターを使って取得します。一件ずつ展開するためメモリの消費が抑えられます。

$itr = new DirectoryIterator('.');
$files = [];

foreach ($itr as $fileinfo) {
    if (!$fileinfo->isFile()) continue;
    $files[] = $fileinfo->getFilename();
} 
print_r($files);

PHPで配列を結合する方法まとめ

今回はPHPで配列を結合する方法をまとめました。

目次

配列を結合する方法

PHPでは下記の方法で配列の結合ができます。

  • array_merge を使う
  • array_merge_recursive を使う
  • + 演算子を使う
  • 配列のアンパックを使う

array_merge を使う

複数の配列を結合する場合に array_merge が使えます。

結合する配列に重複するキーがある場合は、後に指定した配列の要素が優先されます。

$arr1 = ['a' => 11, 'b' => 22, 'c' => 33];
$arr2 = ['c' => 333, 'd' => 44];
$arr3 = array_merge($arr1, $arr2);
var_dump($arr3);

実行結果

array(4) {
  ["a"]=>
  int(11)
  ["b"]=>
  int(22)
  ["c"]=>
  int(333)
  ["d"]=>
  int(44)
}

数値がキーの要素
数値がキーの要素は全て別物として取り扱われ、新しい配列では数値キーが 0 から始まる連番に置き換えられます。

なお、数値キーの内容に意味がある場合は、array_mergeの使用は避けましょう。

$arr1 = [1, 2, 3];
$arr2 = [1, 2, 5];
$arr3 = array_merge($arr1, $arr2);

var_dump($arr3);

実行結果

array(6) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(1)
  [4]=>
  int(2)
  [5]=>
  int(5)
}

array_merge_recursive を使う

複数の配列を再起的に結合する場合に array_merge_recursive が使えます。

キーが重複していた場合は、値は無視されずにキーの値は配列にまとめられます。

$arr1 = [
    'a' => 'orange',
    'b' => 'red',
];

$arr2 = [
    'b' => 'green',
    'c' => 'white',
];

実行結果

array(3) {
  ["a"]=>
  string(6) "orange"
  ["b"]=>
  array(2) {
    [0]=>
    string(3) "red"
    [1]=>
    string(5) "green"
  }
  ["c"]=>
  string(5) "white"
}

ネストした配列の場合もこの通り結合できます。

$arr1 = [
    'a' => 'orange',
    'b' => 'red',
    'c' => [
        'x' => 'blue',
        'y' => 'gold',
    ],
];

$arr2 = [
    'b' => 'green',
    'c' => [
        'y' => 'pink',
        'z' => 'white',
    ],
];

$arr3 = array_merge_recursive($arr1, $arr2);
var_dump($arr3);

実行結果

array(3) {
  ["a"]=>
  string(6) "orange"
  ["b"]=>
  array(2) {
    [0]=>
    string(3) "red"
    [1]=>
    string(5) "green"
  }
  ["c"]=>
  array(3) {
    ["x"]=>
    string(4) "blue"
    ["y"]=>
    array(2) {
      [0]=>
      string(4) "gold"
      [1]=>
      string(4) "pink"
    }
    ["z"]=>
    string(5) "white"
  }
}

ネストした配列を結合処理は複雑になり見通しが悪くなりがちです。こういったケースでは事前に配列の構造を明確に定義しておくことが大切です。

+ 演算子を使う

+ 演算子を使って配列を結合することもできます。
両方の配列に存在するキーは左側の配列要素が優先され、右側の配列にあった同じキーは無視されます。

キーを省略して定義した配列の結合
$arr1と同じインデックスを持つ、$arr2の要素は無視されています。要素番号を数えれば分かるものの、少し分かりづらいですね。

$arr1 = [1, 2];
$arr2 = [3, 4, 5, 6];

$arr3 = $arr1 + $arr2;

実行結果

array(4) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(5)
  [3]=>
  int(6)
}

キーを指定して定義した配列の結合
このように明確にキーを指定した配列であれば、どの要素が結合されるのか明白ですね。

$arr1 = ['a' => 1, 'b' => 2, 'c' => 3];
$arr2 = ['c' => 333, 'd' => '99'];
$arr3 = $arr1 + $arr2;

var_dump($arr3);

実行結果

array(4) {
  ["a"]=>
  int(1)
  ["b"]=>
  int(2)
  ["c"]=>
  int(3)
  ["d"]=>
  string(2) "99"
}

配列のアンパックを使う

配列の前に ... を付けると、配列の値を展開(アンパック)させることができます。PHP7.4以降で利用可能です。

$arr1 = [1, 2, 3];
$arr2 = [3, 4];
$arr3 = [...$arr1, ...$arr2];

var_dump($arr3);

実行結果

array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(3)
  [4]=>
  int(4)
}

まとめ

PHPの配列結合の方法についてまとめてみました。
こうしてまとめてみると、PHPには色々なやり方がありますね。それぞれの特徴を覚えて、活用していきましょう。

PHPのアロー関数のポイントまとめ

最近PHPの言語仕様について改めて勉強しています。
今回はPHPのアロー関数についてまとめてみました。

目次

アロー関数とは

アロー関数は無名関数を簡潔に書ける文法です。
PHP7.4で追加されました。

アロー関数の記述方法

アロー関数の記述方法は次のとおりです。

  • function の代わりに fn という記述を使う
  • 波括弧 {} は使用できない
  • return は使用できない

記述例

// アロー関数
$a = fn($x) => $x + 10; 

// 無名関数
$b = function($x) {
   return $x + 10;
};

無名関数では値を返す際、returnを使用しますが、アロー関数の場合は右辺の式の計算結果が使用されます。

アロー関数の仕様

アロー関数の仕様としては次の通りです。

  • 変数を値でバインドする
  • "use" を使わずに親スコープの変数が使える

スコープ外の変数のバインドがポイントになっていますね。
下記の例では、アロー関数の親スコープで定義されている変数 $x は、無名関数で use($x) を実行している状況とほぼ同じことになります。

$x = 10;
fn($a) => $a + $x;

なお、アロー関数では値でバインドしているため、アロー関数の外のスコープの変数の値は変更できません。アロー関数の外のスコープの値を変更したい場合は無名関数を使うと良いでしょう、。

アロー関数の使いどころ

アロー関数の使いどころとしては、array_mapなどのように引数に関数を受け取って処理を行うような場合に簡潔に表記したい場合などが挙げられます。 ただし、ロジックが複雑な場合は別途関数を定義して使用す流のが良いでしょう。

最低賃金1050円台半ばで最終調整というニュースを見て

今朝Yahooニュースで、「最低賃金1050円台半ばで最終調整 実現なら過去最高」という題の記事を見かけた。

news.yahoo.co.jp

最低賃金が上がる事、だけを見れば良い事のようにも思えるけど、デメリットもあって素直に喜べないところがある。

最低賃金が増えると

  • 人件費が増え企業の負担が増える
  • 扶養範囲内で働く人の労働時間が減る事で労働力が不足する

こういったデメリットもあると思う。企業側の負担が増えた分、労働の効率を上げれば良い、価格転嫁すれば良い、売上を増やせば良いだとかそういった意見もあるけど、そうそう都合よく効率を上げたり、売上を増やしたりできるものだろうか。取引先からの圧力で価格転化が難しい場合もあるし、中小企業はそういった点でかなり不利益を被るように思う。

結果的には労働者の負担が増える事になってしまうように思う。非正規の稼働が減った分、正規雇用の人の負担が増えるとか、どこかしらでバランスを取る必要があるのかなと。

積読で年間1万円以上の無駄になってしまう可能性があるのか?

積読で年間1万円以上の無駄になってしまう可能性がある、という主張について

総務省統計局の「2024年日本の統計」によると、2022年時点におけるジャンルすべてを通した新刊の平均価格は1268円だそうです。

これをもとに計算すると、積読が仮に年間6冊あったと仮定した場合に 1268円 x 6冊 で 7608円分無駄になる。さらに、専門性の高い分野など高額な本を積読すれば、年間で1万円を超える金額を無駄にしているという主張でした。

何をもって「無駄」と定義するのか?

さて、元の記事の無駄、というのはすぐに読みもしない本を買う事は無駄、という事なのだと思います。

ただ、何をもって無駄とするのか、明確な定義がないまま「積読=無駄」というのは若干暴力的な主張のように思います。ということで、私なりの無駄の定義を考えてみたいと思います。

  • 情報の鮮度が重要な本を積読する
  • 自分にとって不要な本を積読する
  • 積読している事を忘れてしまう

情報の鮮度が重要な本を積読する積読する

積読に適さない本としてはWebやインターネット関連の技術書が挙げられます。Web関連の表層的な技術は流行や変化が激しく、数年前の知識では古く役に立たない事が多々あるからです。 書籍化自体は時間がかかりますので、書籍の企画が上がった時点では最新だったものが書籍発売時点で既に古くなっている、なんてこともあります。そういった事から積読をしてしまうとさらに情報が古くなってしまいます。 こういった分野の本については積読せず購入してすぐに読み、本の内容を実践することが望ましいです。

同じ理屈で考えると、観光地の飲食店の特集やイベントのガイドなども時間の経過によって書かれている内容が実情からずれていってしまうことがありそうですね。 時間が経つと、紹介されているお店がなくなっていたり、移転していたり…

ただ、過去の古い情報と照らし合わせる事が必要な場面でもそういった本が日の目を見る事はあるかもしれまんね。

自分にとって不要な本を積読する

当たり前のことですが、いらないものを溜め込むことは健全ではありません。自分にとって必要だからこそ本を買うものだと思います。不要なもののために割くスペースが勿体無いと私は思います。

積読していることを忘れてしまう

個人的には積読そのものよりも、積読していると購入した本を忘れがちなことが問題だと思います。それによって、以前購入したものと全く同じ本を余分に購入してしまう可能性があります。 そういった余分な出費は無駄だと言えるでしょう。

その問題を避けるためには、ジャンルごとに積読している本を把握するための 方法を用意しておくと良いでしょう。

積読しなければ無駄にならないのか?

そもそも、買った本を積読せずに読んだから良い、というものではありません。 例えば本を読んだとしても

  • 読んだ内容を覚えていない
  • 読解できずに間違った理解をしてしまう
  • 古すぎて現在の内容に合っていない本を読んでズレた知識を得る
  • さわりだけ読んでつまらないからと処分してしまう
  • 興味が持てない本を無理して読む
  • 読まなければよかったと思うほど酷い本を読んだ

このように読むことによって自分にとってマイナスになる読書経験もあり得るのです。 積読しないから無駄ではないというものではないように感じます。

積読せざるを得ないケースもある

本は絶版になることがあるのです。特に専門書などは比較的最近のものであっても絶版になってしまうことが多いように思います。10数年ぶりに改訂版が発売されたかと思っていたら数年で絶版になる事は自分の趣味関連の分野でも多々あります。そのため、今すぐに読む予定はないものの容易に入手できるうちに購入しておきたい、というケースもあります。

まとめ

自分なりに積読が無駄になり得るケースについて考えてみました。

色々考えているうちに、積読する以前に購入する価値のない本にうっかり手を出してしまうことが無駄だという結論に至りました。勝負は積読する前に決まっています(笑)。

積読の数よりも、そういった本の購入に費やした金額こそ無駄な出費だと感じます。

ブログ運営で活用したいWebサービス

ブログを運営していると、もっと多くの人に見てもらいたいと思いますよね。そのために、検索エンジンで上位に表示されるようにするSEO検索エンジン最適化)が大切です。今回は、SEOに役立つツールやサービスについてわかりやすく説明します。

目次

Yahoo、Google検索

最初にできることは、YahooやGoogleでキーワードを検索してみることです。そこで上位に表示される競合サイトを見て、どんな内容が人気なのかを調べます。これを参考にして、自分のブログに使うキーワードを選ぶと良いでしょう。人気のキーワードを使うと、ブログを見てもらいやすくなります。

ラッコキーワード

ラッコキーワードは、無料で使えるキーワードリサーチツールです。特定のキーワードに関連する検索語句をたくさん表示してくれます。これを使うと、ブログ記事のテーマやタイトルを決めるのが簡単になります。読者が何を知りたいのかがわかるので、役に立つ記事を書きやすくなります。

Google Search Console

Google Search Consoleは、ブログの状況をチェックできるツールです。どのキーワードでアクセスが多いのか、ブログが検索エンジンにちゃんと表示されているかなどを確認できます。また、問題があれば教えてくれるので、早めに対処できます。これを使えば、ブログの内容をさらに良くしていくことができます。

Google Analytics

Google Analyticsは、ブログに来た人たちの動きを詳しく見ることができるツールです。何人が訪れたか、どのページが人気か、どこから来たのかなどを知ることができます。これを参考にして、どんな記事が求められているのかを見極めることができます。データをもとに、もっと読まれる記事を書くことができます。

Google Keyword Planner

Google Keyword Plannerは、Googleが提供するキーワードリサーチツールです。どのキーワードがどれくらい検索されているか、競争が激しいかどうかを調べることができます。これを使えば、効果的なキーワードを選びやすくなります。このツールで見つけたキーワードを使って記事を書くと、アクセスアップが期待できます。

まとめ

SEO対策には、いろんなツールやサービスを使うと効果的です。YahooやGoogle検索で競合を調べ、ラッコキーワードで関連キーワードを見つけ、Google Search ConsoleGoogle Analyticsでブログのパフォーマンスを確認しましょう。そして、Google Keyword Plannerで良いキーワードを選びます。これらのツールをうまく活用して、ブログをもっと多くの人に見てもらいましょう。

ジャズ理論を学ぶのにおすすめの本はこれ

ジャズ理論関連の本はたくさん出版されていて迷いますよね。

多くの人が学ぶうちに迷い出して色々な本を購入するものの、 使いこなせず本棚で埃をかぶっているなんてことはよく聞く話です。

そんな中で、この本があれば他は買わなくてもOK
と言える良書をこの記事では紹介しています。



セッションでお馴染みの曲集

最近のジャズセッションに行くとよく使われているジャズの曲集が下記の2冊です。 俗に黒本と呼ばれています。類似のもので「リアルブック」もありますが、手軽さや読みやすさは黒本の方に軍配が上がります。
B♭やE♭版もありますので管楽器の方はそちらも探してみると良いでしょう。

日頃の練習に活用したい本

理論的な事を実践的な形でまとめてある2冊ですので、 日頃の練習メニューを考えるときにとても参考になります。

辞書的に使いたい本

ジャズ理論が一通り網羅的に書かれている本がこちらの2冊です。
頭から読み進めても良いですが、気になる箇所をピックアップして読んだり、 辞書のように気になったトピックを調べるのに最適な本です。

その他必要なもの

現状の音楽的な素養がどの程度かは人により異なると思いますが、 音楽経験が少ない方は楽典などを用いて、基本的な楽譜の読み方を学ぶと良いでしょう。 あとは、知識的な学習や楽器の練習とは別に、リズムトレーニングに取り組むとジャズそのものをより一層楽しめるようになります。