preg_split到未知数量的list()元素

时间:2017-01-03 06:35:46

标签: php preg-split

我有一个大概10年前编写的PHP脚本。我不记得当时PHP的版本是什么,但是我的脚本工作得很好而没有来自解释器的抱怨。现在,我不得不将我的脚本移动到一个新的Web主机,并且在PHP 7.x下,解释器大声抱怨这个脚本的某一行,我正在寻找一种优雅的方法让它闭嘴。

违规行是: -

list($degrees, $minutes, $seconds) = preg_split("/ /", $coord);

$coord变量包含以下三种形式之一的GPS坐标:“度数分秒”,“度数小数 - 分钟”或“小数度”。因此,preg_split()可能会返回1,2或3个元素。如果它只返回1或2个元素,则解释器会大声抱怨对$seconds和/或$minutes的未定义引用。我看到有一个我可以为preg_split()指定的LIMIT参数,它给出了要返回的最大元素数,但似乎没有一个补充参数来告诉它要返回的MINIMUM元素数。欢迎任何建议。

样本坐标:' - 97.74019'或'-97 44.411'或'-97 44 24.7'

4 个答案:

答案 0 :(得分:5)

完全赞同Anant,但你可以用更优雅的方式做到:

<?php

$coordArray = preg_split('/ /', $coord);
$degrees = $coordArray[0] ?? 0;
$minutes = $coordArray[1] ?? 0;
$seconds = $coordArray[2] ?? 0;

答案 1 :(得分:2)

该行给出E_NOTICE(&#34;注意:未定义的偏移量:X在第1行和第34行的命令行代码中;)。您可以将错误报告级别更改为不包括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);

答案 2 :(得分:2)

您可以转换下面的代码: -

$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

它不会停止程序执行,但你可以通过上面的代码来解决这个问题

答案 3 :(得分:0)

array_pad 包裹可变大小的数组,如下所示:

list($degrees, $minutes, $seconds) = array_pad( preg_split("/ /", $coord), 3, null);

您的直觉是正确的,您需要最少数量的元素返回,而这正是 array_pad 将为您做的。