我有一个函数,可以根据名称更改十进制数字的长度。我需要使用该功能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);
}
如果我在第一个功能上进行了以下更改,它将起作用,但这不是我想要的。
顺便说一句,我尝试在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);
}
答案 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, '.');