Laravel“未定义索引...”在Foreach循环中发生错误

时间:2019-09-18 15:48:37

标签: php laravel

  • Laravel 5.7

我有一个函数,可以根据名称更改十进制数字的长度。我需要使用该功能9次。这就是为什么我要调用它的原因,但是却收到“未定义的索引停止”错误。

function makeDecimals()
{
    global $input, $decimal;
    $datas = ["entry", "stop", "target"];

    foreach ($datas as $data) {

        if (strlen($input[$data]) > 0) { //This is the line that throw the error.

            $input[$data] = str_replace(',', '.', $input[$data]);
            $dataArray = explode(".", $input[$data]);

            if (count($dataArray) == 1) {
                $decimalPart = null;
            } else {
                $decimalPart = $dataArray[1];
            }

            if ($decimalPart != null) {
                $decimalLength = strlen($decimalPart);

                if ($decimalLength < $decimal) {
                    for ($i = $decimalLength; $i < $decimal; $i++) {
                        $input[$data] = $input[$data] . 0;
                    }
                }
                if ($decimalLength > $decimal) {
                    for ($i = $decimalLength; $i > $decimal; $i--) {
                        $input[$data] = substr($input[$data], 0, -1);
                    }
                }
            } else {
                $input[$data] = $input[$data] . '.';
                for ($i = 0; $i < $decimal; $i++) {
                    $input[$data] = $input[$data] . 0;
                }
            }
        } else {
            $input[$data] = null;
        }
    }
}

我正在Laravel的store和update函数内部调用上面的函数。例如:

public function update(Request $request, $id)
{
    $transaction = Trade::findOrFail($id);
    $input = $request->all();
    $assetName = $input['asset'];


    if (strpos($assetName, 'XAU') !== false || strpos($assetName, 'OIL') !== false) {
        $decimal = 2;
    } elseif (strpos($assetName, 'JPY') !== false || strpos($assetName, 'XAG') !== false) {
        $decimal = 3;
    } else {
        $decimal = 5;
    }

    $this->makeDecimals();

    $transaction->update($input);
}

如果我在第一个功能上进行了以下更改,它将起作用,但这不是我想要的。

  • 删除foreach循环
  • 分别使用$ input ['entry'],$ input ['stop']和$ input ['target']来代替$ input [$ data]。
  • 不是多次调用函数,而是将代码块粘贴到不同的$ input ['...']。

顺便说一句,我尝试在makeDecimals函数内部使用$ input ['entry']而不是$ input [$ data]。它没有给出任何错误,但是函数没有执行应有的操作。

编辑:

由于我得到了答案,我想我也应该把这一部分也放在。如前所述,如果不直接调用函数,则直接使用代码块即可。例如,如果我将更新功能更改为该功能,它将起作用。

public function update(Request $request, $id)
{
    // The codes down below are the same as my original update function

    $transaction = Trade::findOrFail($id);
    $input = $request->all();
    $assetName = $input['asset'];


    if (strpos($assetName, 'XAU') !== false || strpos($assetName, 'OIL') !== false) {
        $decimal = 2;
    } elseif (strpos($assetName, 'JPY') !== false || strpos($assetName, 'XAG') !== false) {
        $decimal = 3;
    } else {
        $decimal = 5;
    }

    // The end of the same codes.


    // I removed $this->makeDecimals() and paste the codes down below.
    // The differences are:
    // • There is no foreach loop.
    // • I used  $input['entry'] instead of $input[$data]
    // When I duplicate those codes and use 'stop' instead of 'entry', it also works.

    if ($input['entry']) {

        $input['entry'] = str_replace(',', '.', $input['entry']);
        $entryArray = explode(".", $input['entry']);

        if (count($entryArray) == 1) {
            $decimalPart = null;
        } else {
            $decimalPart = $entryArray[1];
        }

        if ($decimalPart != null) {
            $decimalLength = strlen($decimalPart);

            if ($decimalLength < $decimal) {
                for ($i = $decimalLength; $i < $decimal; $i++) {
                    $input['entry'] = $input['entry'] . 0;
                }
            }
            if ($decimalLength > $decimal) {
                for ($i = $decimalLength; $i > $decimal; $i--) {
                    $input['entry'] = substr($input['entry'], 0, -1);
                }
            }
        } else {
            $input['entry'] = $input['entry'] . '.';

            for ($i = 0; $i < $decimal; $i++) {
                $input['entry'] = $input['entry'] . 0;
            }
        }

        $transaction->update($input);
    }

2 个答案:

答案 0 :(得分:0)

错误很明显,您的输入中不存在“停止”字样。快速检查可以解决此问题。

    if (strlen($input[$data]) > 0) { //This is the line that throw the error.

收件人:

    if (isset($input[$data]) && strlen($input[$data]) > 0) { 

答案 1 :(得分:0)

据我了解,您的功能function makeDecimals()只是来自PHP的number_format加上str_replace。

您可以像这样使用它

$number = $request->input('entry');
$formatedNumber = number_format(str_replace(',', '.', $number), $decimal, '.');