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>';