2016年12月25日日曜日

PHP/わかっていなかった空文字判定

途中に空行を含む標準入力を最後まで読み込む、というのをwhile/fgets(STDIN)/trimで書こうとしたら少しハマった。

こんな標準入力だと仮定して
0

hoge
結局、下記のように書いてFix
<?php
// 標準入力から1行データを取得
$input = fgets(STDIN);
// $inputの値が空で無ければループする
while( $input != "" ) {
    // 配列に$inputの値を追加
    $array[] = trim($input);
    // 標準入力から1行データを取得
    $input = fgets(STDIN);
}
print_r($array);
?>
追記
while ( $input != "" ) でなくて、while ( $input ) であれば十分でした。。。
trimしないことで、改行コードが残るんで。

注意点
  • 「改行コード」をtrimして変数に代入した場合、その変数は定義済みだが「空」であること(nullじゃない)
  • 判定前にtrimしてしまうと改行コードも空に成ってしまい、データがないことによる「空」と区別がつかない
  • 配列に改行コードは入れたくない

こちらのサイトを参考にさせてもらいました。
Allied ArchitectsEngineer Blog 空文字とかNULLとか0とか


おまけ

自分でも少し検証してみました。
まぁ、そうなりますよね。

結果
"0"
if ( $a ) : false
if ( $a == "" ) : false
if ( $a === "" ) : false
if ( is_null($a) ) : false
*******************************
null
if ( $a ) : false
if ( $a == "" ) : true
if ( $a === "" ) : false
if ( is_null($a) ) : true
*******************************
trim("\n")
if ( $a ) : false
if ( $a == "" ) : true
if ( $a === "" ) : true
if ( is_null($a) ) : false
*******************************
""
if ( $a ) : false
if ( $a == "" ) : true
if ( $a === "" ) : true
if ( is_null($a) ) : false
*******************************
"\n"
if ( $a ) : true
if ( $a == "" ) : false
if ( $a === "" ) : false
if ( is_null($a) ) : false
*******************************
0
if ( $a ) : false
if ( $a == "" ) : true
if ( $a === "" ) : false
if ( is_null($a) ) : false
コード

$a = "0";
echo "\"0\""."\n";
if ( $a ) {
    echo "if ( \$a ) : true\n";
} else {
    echo "if ( \$a ) : false\n";
}

if ( $a == "") {
    echo "if ( \$a == \"\" ) : true\n";
} else {
    echo "if ( \$a == \"\" ) : false\n";
}

if ( $a === "") {
    echo "if ( \$a === \"\" ) : true\n";
} else {
    echo "if ( \$a === \"\" ) : false\n";
}

if ( is_null($a) ) {
    echo "if ( is_null(\$a) ) : true\n";
} else {
    echo "if ( is_null(\$a) ) : false\n";
}

echo "*******************************\n";

$a = null;
echo "null"."\n";
if ( $a ) {
    echo "if ( \$a ) : true\n";
} else {
    echo "if ( \$a ) : false\n";
}

if ( $a == "") {
    echo "if ( \$a == \"\" ) : true\n";
} else {
    echo "if ( \$a == \"\" ) : false\n";
}

if ( $a === "") {
    echo "if ( \$a === \"\" ) : true\n";
} else {
    echo "if ( \$a === \"\" ) : false\n";
}


if ( is_null($a) ) {
    echo "if ( is_null(\$a) ) : true\n";
} else {
    echo "if ( is_null(\$a) ) : false\n";
}


echo "*******************************\n";


// $a = "";
$a = trim("\n");
echo "trim(\"\\n\")"."\n";
if ( $a ) {
    echo "if ( \$a ) : true\n";
} else {
    echo "if ( \$a ) : false\n";
}

if ( $a == "") {
    echo "if ( \$a == \"\" ) : true\n";
} else {
    echo "if ( \$a == \"\" ) : false\n";
}

if ( $a === "") {
    echo "if ( \$a === \"\" ) : true\n";
} else {
    echo "if ( \$a === \"\" ) : false\n";
}

if ( is_null($a) ) {
    echo "if ( is_null(\$a) ) : true\n";
} else {
    echo "if ( is_null(\$a) ) : false\n";
}


echo "*******************************\n";


$a = "";
echo "\"\""."\n";
if ( $a ) {
    echo "if ( \$a ) : true\n";
} else {
    echo "if ( \$a ) : false\n";
}

if ( $a == "") {
    echo "if ( \$a == \"\" ) : true\n";
} else {
    echo "if ( \$a == \"\" ) : false\n";
}

if ( $a === "") {
    echo "if ( \$a === \"\" ) : true\n";
} else {
    echo "if ( \$a === \"\" ) : false\n";
}

if ( is_null($a) ) {
    echo "if ( is_null(\$a) ) : true\n";
} else {
    echo "if ( is_null(\$a) ) : false\n";
}

echo "*******************************\n";


$a = "\n";
echo "\"\\n\""."\n";
if ( $a ) {
    echo "if ( \$a ) : true\n";
} else {
    echo "if ( \$a ) : false\n";
}

if ( $a == "") {
    echo "if ( \$a == \"\" ) : true\n";
} else {
    echo "if ( \$a == \"\" ) : false\n";
}

if ( $a === "") {
    echo "if ( \$a === \"\" ) : true\n";
} else {
    echo "if ( \$a === \"\" ) : false\n";
}

if ( is_null($a) ) {
    echo "if ( is_null(\$a) ) : true\n";
} else {
    echo "if ( is_null(\$a) ) : false\n";
}


echo "*******************************\n";


$a = 0;
echo "0"."\n";
if ( $a ) {
    echo "if ( \$a ) : true\n";
} else {
    echo "if ( \$a ) : false\n";
}

if ( $a == "") {
    echo "if ( \$a == \"\" ) : true\n";
} else {
    echo "if ( \$a == \"\" ) : false\n";
}

if ( $a === "") {
    echo "if ( \$a === \"\" ) : true\n";
} else {
    echo "if ( \$a === \"\" ) : false\n";
}

if ( is_null($a) ) {
    echo "if ( is_null(\$a) ) : true\n";
} else {
    echo "if ( is_null(\$a) ) : false\n";
}


?>

0 件のコメント:

コメントを投稿