コンパクトなプログラムvs.直感でわかるプログラム
一番小さいのをどう選ぶ?
さて、配列の中から一番小さいものを「取り出す」関数を作らなければなりません。考え方はいろいろとあるでしょうが、ここでは次のように考えてみました。
(1)左から順に見ていくとして、見た中で一番小さいものの「場所」を覚えておく。
(2)順にその「場所」にあるものとを比較して、もっと小さいものが現れたら、覚えておいた「場所」を変更する。
(3)これを最後まで繰り返す。
一番小さなものが置かれている場所を覚えておいて、必要に応じてその場所を変更しよう、というわけです。
配列から一番小さいものを取り出す関数「pickup_small()」を作りましょう。図2の上のような感じです。
プログラミングのポイントは?
一番小さいものが置かれている「場所」を「$index」で表しています(1)。はじめは最初のものを仮の候補としておいて、その次のものから順に見ていき(2)、$indexの場所にあるものよりも小さなものが出てきたら(3)、その場所情報を更新します(4)。
これで、このループを抜けたときには$indexには、一番大きなものの「位置」が残っていることになります。
あとは、この場所にあるものを取り出すだけですが、取り出した際に、それが元の配列に残っていては具合が悪いので配列から取り去ります。そのためには「array_splice()」が便利でしょう(5)。ほかにも手はあるかもしれませんが...。
array_splice() 取り出したものを要素とする「配列」として返すので、最後のように、その最初の(つまり1つだけの)要素を返すようにします(6)。
これで「pickup_small()」は一応は完成なのですが、「$arr」が空っぽになるタイミングがあります。それを考慮しないといけませんね。それで、初めに引数をチェックする機能を加えましょう。(図2の(7))
これで完成です。