preg_split 到未知数量的 list() 元素
preg_split to unknown number of list() elements
我有一个 PHP 脚本,大概是 10 年前写的。我不记得当时 PHP 是什么版本,但我的脚本工作得很好,没有解释器的抱怨。现在,我不得不将我的脚本移动到一个新的网络主机,并且在 PHP 7.x 下,解释器大声抱怨这个脚本的某一行,我正在寻找一种优雅的方式来让它闭嘴。
违规行是:-
list($degrees, $minutes, $seconds) = preg_split("/ /", $coord);
$coord
变量包含三种形式之一的 GPS 坐标:"degrees minutes seconds"、"degrees decimal-minutes" 或 "decimal-degrees"。因此,preg_split()
可能 return 1、2 或 3 个元素。如果它 return 只有 1 个或 2 个元素,解释器会大声抱怨对 $seconds
and/or $minutes
的未定义引用。我看到我可以为 preg_split()
指定一个 LIMIT 参数,它为 return 提供最大元素数,但似乎没有免费参数来告诉它 MINIMUM 数量return 的元素。欢迎提出任何建议。
样本坐标:“-97.74019”或“-97 44.411”或“-97 44 24.7”
行给出了E_NOTICE
("Notice: Undefined offset: X in Command line code on line 1")。您可以将错误报告级别更改为不包括 E_NOTICE
或仅使用 @
运算符隐藏禁用此特定行的错误报告。在这里使用 @
没有坏处。不匹配的变量将被赋值为 NULL(在 5 和 7 中):
$coord = "x y";
@list($degrees, $minutes, $seconds) = preg_split("/ /", $coord);
var_dump($degrees, $minutes, $seconds);
给出:
string(1) "x"
string(1) "y"
NULL
我一般不会推荐它,但要抑制所有 E_NOTICE
错误通知,您可以在 error_reporting 设置中取消设置:
ini_set("error_reporting", E_ALL&~E_NOTICE);
您可以像下面这样转换该代码:-
$d_m_s_array = preg_split("/ /", $coord);
$degrees = (!empty($d_m_s[0]) ? $d_m_s[0] :0;
$minutes = (!empty($d_m_s[1]) ? $d_m_s[1] :0;
$seconds = (!empty($d_m_s[2]) ? $d_m_s[2] :0;
注:-
此外,您的原始代码只会生成一个通知(如果错误报告也为此打开)。看这里:- https://eval.in/707979
它不会停止程序执行,但是你可以+不得不-通过上面的代码解决这个通知
完全同意 Anant 的观点,但你可以用更优雅的方式来做:
<?php
$coordArray = preg_split('/ /', $coord);
$degrees = $coordArray[0] ?? 0;
$minutes = $coordArray[1] ?? 0;
$seconds = $coordArray[2] ?? 0;
用 array_pad 包装可变大小的数组,如下所示:
list($degrees, $minutes, $seconds) = array_pad( preg_split("/ /", $coord), 3, null);
您的直觉是正确的,您需要 MINIMUM 个元素才能 return,而这正是 array_pad 将为您做的。
我有一个 PHP 脚本,大概是 10 年前写的。我不记得当时 PHP 是什么版本,但我的脚本工作得很好,没有解释器的抱怨。现在,我不得不将我的脚本移动到一个新的网络主机,并且在 PHP 7.x 下,解释器大声抱怨这个脚本的某一行,我正在寻找一种优雅的方式来让它闭嘴。
违规行是:-
list($degrees, $minutes, $seconds) = preg_split("/ /", $coord);
$coord
变量包含三种形式之一的 GPS 坐标:"degrees minutes seconds"、"degrees decimal-minutes" 或 "decimal-degrees"。因此,preg_split()
可能 return 1、2 或 3 个元素。如果它 return 只有 1 个或 2 个元素,解释器会大声抱怨对 $seconds
and/or $minutes
的未定义引用。我看到我可以为 preg_split()
指定一个 LIMIT 参数,它为 return 提供最大元素数,但似乎没有免费参数来告诉它 MINIMUM 数量return 的元素。欢迎提出任何建议。
样本坐标:“-97.74019”或“-97 44.411”或“-97 44 24.7”
行给出了E_NOTICE
("Notice: Undefined offset: X in Command line code on line 1")。您可以将错误报告级别更改为不包括 E_NOTICE
或仅使用 @
运算符隐藏禁用此特定行的错误报告。在这里使用 @
没有坏处。不匹配的变量将被赋值为 NULL(在 5 和 7 中):
$coord = "x y";
@list($degrees, $minutes, $seconds) = preg_split("/ /", $coord);
var_dump($degrees, $minutes, $seconds);
给出:
string(1) "x"
string(1) "y"
NULL
我一般不会推荐它,但要抑制所有 E_NOTICE
错误通知,您可以在 error_reporting 设置中取消设置:
ini_set("error_reporting", E_ALL&~E_NOTICE);
您可以像下面这样转换该代码:-
$d_m_s_array = preg_split("/ /", $coord);
$degrees = (!empty($d_m_s[0]) ? $d_m_s[0] :0;
$minutes = (!empty($d_m_s[1]) ? $d_m_s[1] :0;
$seconds = (!empty($d_m_s[2]) ? $d_m_s[2] :0;
注:-
此外,您的原始代码只会生成一个通知(如果错误报告也为此打开)。看这里:- https://eval.in/707979
它不会停止程序执行,但是你可以+不得不-通过上面的代码解决这个通知
完全同意 Anant 的观点,但你可以用更优雅的方式来做:
<?php
$coordArray = preg_split('/ /', $coord);
$degrees = $coordArray[0] ?? 0;
$minutes = $coordArray[1] ?? 0;
$seconds = $coordArray[2] ?? 0;
用 array_pad 包装可变大小的数组,如下所示:
list($degrees, $minutes, $seconds) = array_pad( preg_split("/ /", $coord), 3, null);
您的直觉是正确的,您需要 MINIMUM 个元素才能 return,而这正是 array_pad 将为您做的。