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 将为您做的。