Php 函数在foreach中运行时遇到的格式不正确的数值
由于某种原因,当我尝试循环一个数组并更改它的值时,我总是收到这个通知 出于某种原因,当运行更改值的同一函数时,数组正在传递两个值,一个在前面,一个在后面Php 函数在foreach中运行时遇到的格式不正确的数值,php,arrays,Php,Arrays,由于某种原因,当我尝试循环一个数组并更改它的值时,我总是收到这个通知 出于某种原因,当运行更改值的同一函数时,数组正在传递两个值,一个在前面,一个在后面 class UnitConverter { public $vulgar_to_float = array('½' => '1/2'); public function replaceUnicode($amount){ foreach($this->vulgar_to_float as $key
class UnitConverter {
public $vulgar_to_float = array('½' => '1/2');
public function replaceUnicode($amount){
foreach($this->vulgar_to_float as $key => $float){
if(is_numeric($amount)){
return $amount;
} else if($key === $amount){
return $float;
}
}
}
public function convertAmount($amount, $from, $to){
if($from === 'pound' && $to === 'ounce'){
return $amount * 16;
} else if($from === 'cup' && $to === 'tablespoon'){
print_r($amount); // here it's echoing 2 values when it should be 1
return $this->replaceUnicode($amount) * 16;
} else {
throw new \Exception('Unable to convert ' . $from . ' to ' . $to);
}
}
}
function convertIngredients($arr){
foreach($arr as $key => $value){
if($arr[$key]['unit_name'] === 'pound'){
$arr[$key]['amount'] = (new UnitConverter())->convertAmount($arr[$key]['amount'], 'pound', 'ounce');
$arr[$key]['unit_name'] = 'ounce';
} else if($arr[$key]['unit_name'] === 'cup'){
$arr[$key]['amount'] = (new UnitConverter())->convertAmount($arr[$key]['amount'], 'cup', 'tablespoon');
$arr[$key]['unit_name'] = 'tablespoon';
}
}
return $arr;
}
function generateBreakfast(){
$array = $var = array(
0 => array( 'amount' => 1, 'ingredient_name' => 'almond flour', 'unit_name' => 'cup' ),
1 => array( 'amount' => ½, 'ingredient_name' => 'erythritol', 'unit_name' => 'cup' ),
2 => array( 'amount' => 1, 'ingredient_name' => 'egg', 'unit_name' => 'large' )
);
$converted_ingredients = convertIngredients($array);
return $converted_ingredients;
}
echo '<pre>';
print_r(generateBreakfast());
echo '</pre>';
class-UnitConverter{
public$vulgar_to_float=数组('½'=>'1/2');
公共职能部门(金额){
foreach($this->vulgar\u to\u float as$key=>$float){
如果(是数字($amount)){
返回$amount;
}否则如果($key===$amount){
返回$float;
}
}
}
公共功能转换金额($amount,$from,$to){
如果($from=='pound'和&$to=='ounce'){
返回$amount*16;
}如果($from=='cup'&&&$to=='tablespoon'){
print_r($amount);//在这里,当它应该是1时,它会回显2个值
返回$this->replaceUnicode($amount)*16;
}否则{
抛出new\Exception('无法将'.$from.'转换为'.$to');
}
}
}
功能转换组件($arr){
foreach($arr作为$key=>$value){
如果($arr[$key]['unit\u name']='pound'){
$arr[$key]['amount']=(new UnitConverter())->convertAmount($arr[$key]['amount'],'pound','盎司');
$arr[$key]['unit_name']=“盎司”;
}否则如果($arr[$key]['unit_name']=='cup'){
$arr[$key]['amount']=(new UnitConverter())->convertAmount($arr[$key]['amount'],'cup','tablespoon');
$arr[$key]['unit_name']='tablespoon';
}
}
返回$arr;
}
函数生成器breakfast(){
$array=$var=array(
0=>数组('amount'=>1,'Component\u name'=>'杏仁粉','unit\u name'=>'杯子'),
1=>数组('amount'=>½,'Component\u name'=>'erythristol','unit\u name'=>'cup'),
2=>数组('amount'=>1,'Component\u name'=>'egg','unit\u name'=>'large')
);
$converted_配料=converted配料($array);
返回$converted_配料;
}
回声';
print_r(generateBreakfast());
回声';
所以在ConvertComponents中,我们调用convertAmount方法,但出于某种原因。。它传递这个“1½”,而不是在每次迭代中单独调用该方法
如果你看这里:,赤藓糖醇的含量显示为16,但它应该是8,因为16的1/2=8。用
<?php
class UnitConverter {
public $vulgar_to_float = ['½' => 0.5];
public function replaceUnicode( $amount = 0 ){
$half = $this->vulgar_to_float['½'];
return ( is_numeric( $amount ) )? $amount : $half;
}
public function convertAmount($amount, $from, $to){
if($from === 'pound' && $to === 'ounce'){
return $amount * 16;
} else if($from === 'cup' && $to === 'tablespoon'){
return $this->replaceUnicode( $amount ) * 16;
} else {
throw new Exception('Unable to convert ' . $from . ' to ' . $to);
}
}
}
function convertIngredients( $arr = null){
$unit_names = array_column($arr, 'unit_name');
foreach($unit_names as $key => $unit){
if( $unit === 'pound'){
$arr[$key]['amount'] = (new UnitConverter())->convertAmount($arr[$key]['amount'], $unit, 'ounce');
$arr[$key]['unit_name'] = 'ounce';
} else if($unit === 'cup'){
$arr[$key]['amount'] = (new UnitConverter())->convertAmount($arr[$key]['amount'], $unit, 'tablespoon');
$arr[$key]['unit_name'] = 'tablespoon';
} else {
continue;
}
}
return $arr;
}
function generateBreakfast(){
$array = [
0 => array( 'amount' => 1, 'unit_name' => 'cup', 'ingredient_name' => 'almond flour' ),
1 => array( 'amount' => '½', 'unit_name' => 'cup', 'ingredient_name' => 'erythritol' ),
2 => array( 'amount' => 1, 'unit_name' => 'large', 'ingredient_name' => 'egg' )
];
return convertIngredients($array);
}
echo '<pre>';
print_r(generateBreakfast());
echo '</pre>';
。。。还有它
目前,16*“1/2”
表达式由代码计算。您可能希望PHP自动将第二个操作数“解析”为正确的数值。但事实并非如此,因为解析规则(应用于字符串以尝试将其转换为数字)因此它与字符串的其余部分一起被丢弃
这意味着,16*'1/2'
的值是到16*1
——正如您清楚地注意到的,这是16
这一改变防止了这一错误,并使PHP的使用变得更加简单:如果你想得到一个float作为
replaceUnicode
返回值,那么从一开始就在映射中使用float,这样引擎就不必花时间在类型转换上。对于@raina77ow指出了必要的更正,这是值得称赞的。我继续检查代码,并将其修改如下:
我花了5个多小时来调试它!呵呵。非常感谢你的解释,帮助我理解了很多!
<?php
class UnitConverter {
public $vulgar_to_float = ['½' => 0.5];
public function replaceUnicode( $amount = 0 ){
$half = $this->vulgar_to_float['½'];
return ( is_numeric( $amount ) )? $amount : $half;
}
public function convertAmount($amount, $from, $to){
if($from === 'pound' && $to === 'ounce'){
return $amount * 16;
} else if($from === 'cup' && $to === 'tablespoon'){
return $this->replaceUnicode( $amount ) * 16;
} else {
throw new Exception('Unable to convert ' . $from . ' to ' . $to);
}
}
}
function convertIngredients( $arr = null){
$unit_names = array_column($arr, 'unit_name');
foreach($unit_names as $key => $unit){
if( $unit === 'pound'){
$arr[$key]['amount'] = (new UnitConverter())->convertAmount($arr[$key]['amount'], $unit, 'ounce');
$arr[$key]['unit_name'] = 'ounce';
} else if($unit === 'cup'){
$arr[$key]['amount'] = (new UnitConverter())->convertAmount($arr[$key]['amount'], $unit, 'tablespoon');
$arr[$key]['unit_name'] = 'tablespoon';
} else {
continue;
}
}
return $arr;
}
function generateBreakfast(){
$array = [
0 => array( 'amount' => 1, 'unit_name' => 'cup', 'ingredient_name' => 'almond flour' ),
1 => array( 'amount' => '½', 'unit_name' => 'cup', 'ingredient_name' => 'erythritol' ),
2 => array( 'amount' => 1, 'unit_name' => 'large', 'ingredient_name' => 'egg' )
];
return convertIngredients($array);
}
echo '<pre>';
print_r(generateBreakfast());
echo '</pre>';