Edited at

英数字を入力で受け取り,数値表示に変えて出力する(PHPで実装してみた)


はじめに

Qiitaに初めて投稿するので,

見にくい記事になるかもしれませんが,

ご勘弁ください.

筆者はPHPを約3年ほど触れている院生です.

なので多少自身があったのですが,

ある企業さんのコーディングテストで打ちのめされてしまい,

とても悔しいので,記事として投稿させていただきます.

もちろん問題内容は少し変えています.

(もし規則的にダメなことをしてしまっていたらすぐに非公開にします)

他に書く理由として,

「ここはこう書くんだよ」だったり,

「これはこの関数でできちゃうよ」というコメントが欲しいからです.

なので,遠慮なさらずに,アドバイスください.


実装したい機能概要

例えば, "one" と打てば "1" が出力されるというもの.

それが, "," を切れ目として羅列しているデータが入力となり,

出力はその英数字群を数字に直したもの.

入力:one,two,three

出力:123


実際に馬鹿正直に実装してみる

一応実装できたソースコードは以下の通りです.

コメントで疑問を残しております...

(アドバイス・解説コメントお待ちしておりますw)


test.php

<?php

$num = $_POST['num']; #入力データを変数に格納
$nums = explode(",",$num); #カンマで分けて,分けた文字列を配列に格納して行く
$i = 0;
$array = array(); #空の配列を用意して,そこに入れて最後にまとめて表示しようとしている

while($i < count($nums)){
if(strcmp($nums[$i], "zero") == 0){
$array[$i] = "0"; #$array配列に格納する際に" "を書かないとなぜか格納してくれなかった
echo $array[$i]; #正直 "echo 0" と書いた方が早いかもしれないが,配列に入れて最後に表示できる方が格好いいと思ったためこう書いている
$i++;
}else if (strcmp($nums[$i], "one") == 0){
$array[$i] = "1";
echo $array[$i];
$i++;
}else if (strcmp($nums[$i], "two") == 0){
$array[$i] = "2";
echo $array[$i];
$i++;
}else if (strcmp($nums[$i], "three") == 0){
$array[$i] = "3";
echo $array[$i];
$i++;
}else if (strcmp($nums[$i], "four") == 0){
$array[$i] = "4";
echo $array[$i];
$i++;
}else if (strcmp($nums[$i], "five") == 0){
$array[$i] = "5";
echo $array[$i];
$i++;
}else if (strcmp($nums[$i], "six") == 0){
$array[$i] = "6";
echo $array[$i];
$i++;
}else if (strcmp($nums[$i], "seven") == 0){
$array[$i] = "7";
echo $array[$i];
$i++;
}else if (strcmp($nums[$i], "eight") == 0){
$array[$i] = "8";
echo $array[$i];
$i++;
}else if (strcmp($nums[$i], "nine") == 0){
$array[$i] = "9";
echo $array[$i];
$i++;
}
#各if文内の"echo $array[$i];$i++"を消して,ここに"echo $array[$i];i++;"でまとめようとしたができなかった. これはif文を出るとwhileが次のターンにいっているからなの?
}

?>



アドバイスを踏まえて実装してみた

2018.10.12追記

アドバイスコメントで,

str_replace( $検索文字列 , $置換後文字列 , $検索対象文字列 )

を用いたソースコードを教えて頂いたので,

そのコードも載せておきます.


test.php

<?php

$num = $_POST['num'];
function str2int($str){
return str_replace(explode('/', 'zero/one/two/three/four/five/six/seven/eight/nine/,'), range(0,9), $str);
}
#explode()で'/'を排除して,"英字" と "," を各配列に入れます
#zero→0 one→1 ","→" " に置き換える関数

$num_int = str2int($num);
echo $num_int;
?>



最後に

筆者の書き方はあまり良くないことは自覚しています...

例えば,英数字を数字に変えるライブラリや関数があれば,if分岐をする必要がないわけで...

あとは出力の仕方で賢い方法等あればコメント欲しいです!

初投稿でしたが,

こんな感じでいいのかな?