1

次のコード スニペットの場合、答えは 15 です。

$a = '5 USD';
$b = 10;
echo $a + $b;

しかし、変数$aでは、が出力の5'USD'または後にある場合は です。なぜそうなのですか?'USD'10

4

3 に答える 3

13

php.netから:

文字列が数値コンテキストで評価されると、結果の値と型は次のように決定されます。

文字列に '.'、'e'、'E' のいずれの文字も含まれず、数値が整数型の制限 (PHP_INT_MAX で定義) に収まる場合、文字列は整数として評価されます。それ以外の場合はすべて、float として評価されます。

値は文字列の最初の部分によって与えられます。文字列が有効な数値データで始まる場合、これが使用される値になります。それ以外の場合、値は 0 (ゼロ) になります。有効な数値データは、オプションの符号であり、その後に 1 つ以上の数字 (オプションで小数点を含む) が続き、その後にオプションの指数が続きます。指数は、'e' または 'E' の後に 1 つ以上の数字が続きます。

文字通り:

  1. $a + $bを意味しnumeric + numericます。
  2. "5 USD" は有効な数値データで始まるため、PHP はそれを に変換し5ます。
  3. "USD 5"or無効な数値データで"U5SD" 始まるため、PHP はそれを に変換し0ます。

UPDv1:

<?php
header('Content-Type: text/plain');

function plus($a, $b){
    echo $a, ' + ', $b, ' = ', $a + $b, PHP_EOL;
}

plus('5 frogs', 3);   // 5 + 3 = 8
plus('frogs: 5', 3);  // 0 + 3 = 3
plus('f5rogs', 3);    // 0 (not HEX)  + 3 = 3
plus('0xF5', 3);      // 245 (HEX)    + 3 = 248
plus('0011b', 3);     // 11 (not BIN) + 3 = 14
plus('1E5', '1.2xx'); // 100000 (FLOAT) + 1.2 (FLOAT) = 100001.2
plus('true', 2);      // 0 (not BOOL)   + 2 = 2
?>

また、これをチェックしてください: php string number concatenation messed up .


UPDv2:

ゼロフィル効果に関係なく、PHP が文字列値を 8 進数に型キャストする「方法はありません」。それでも、前述のように、PHP は文字列を 16 進数に型キャストできます。

<?php
header('Content-Type: text/plain');

function plus($a, $b){
    echo $a, ' + ', $b, ' = ', $a + $b, PHP_EOL;
}

plus(008, 12);     // Invalid octal, PHP assumes it is 0. Result: 12.
plus('008', 12);   // Invalid octal? No, it is decimal. Result: 20.
plus(0x0F, 1);     // Valid hexadecimal. Result: 16.
plus('0x0F', 1);   // Valid hexadecimal. Result: 16.
plus('0x0X', 1);   // Invalid hexadecimal, PHP assumes it is 0. Result: 1.
?>

「文字列から数値への変換」ドキュメントには記載されていません。

于 2013-05-31T06:35:57.420 に答える
6

PHP マニュアルを参照してくださいLanguage.types.string.conversion

数値への文字列変換

文字列が数値コンテキストで評価されると、結果の値と型は次のように決定されます。

文字列に '.'、'e'、'E' のいずれの文字も含まれず、数値が整数型の制限 (PHP_INT_MAX で定義) に収まる場合、文字列は整数として評価されます。それ以外の場合はすべて、float として評価されます。

値は文字列の最初の部分によって与えられます。文字列が有効な数値データで始まる場合、これが使用される値になります。それ以外の場合、値は 0 (ゼロ) になります。有効な数値データは、オプションの符号であり、その後に 1 つ以上の数字 (オプションで小数点を含む) が続き、その後にオプションの指数が続きます。指数は、'e' または 'E' の後に 1 つ以上の数字が続きます。

例はマニュアルに記載されています (上記のリンク)。

$foo = 1 + "bob-1.3e3";           // $foo is integer (1)
$foo = 1 + "bob3";                // $foo is integer (1)
$foo = 1 + "10 Small Pigs";       // $foo is integer (11)

あなたの質問に答える

$a = '5 USD'; // The string starts with number, so by an implicit cast to int, it will be 5
$b = 10;
echo $a + $b; // = 15

あなたが書いた他の例では

$a = 'USD 5'; // The string does not start with a number, so by an implicit cast to int, it will be 0
$b = 10;
echo $a + $b; // = 10

この変換の詳細については、strtod(3) の Unix マニュアル ページを参照してください。

于 2013-05-31T06:37:17.167 に答える
1

なぜなら

php > echo (int)"a";
0

したがって、PHP実行可能ファイルに

php > "USD 5" + "10"

両方のオペランドを整数にキャストします。

php > (int)"USD 5" + (int)"10"

したがって、 の結果が得られます0 + 10

于 2013-05-31T06:36:09.977 に答える