Php preg_拆分为未知数量的list()元素

Php preg_拆分为未知数量的list()元素,php,preg-split,Php,Preg Split,我有一个PHP脚本,大概是10年前写的。我不记得当时是什么版本的PHP,但我的脚本运行得很好,没有来自解释器的抱怨。现在,我不得不把我的脚本转移到一个新的web主机上,在PHP7.x下,解释器大声抱怨这个脚本的某一行,我正在寻找一种优雅的方法让它闭嘴 令人不快的是:- list($degrees, $minutes, $seconds) = preg_split("/ /", $coord); $coord变量包含三种形式之一的GPS坐标:“度-分-秒”、“度-小数点-分”或“小数点-度”。因

我有一个PHP脚本,大概是10年前写的。我不记得当时是什么版本的PHP,但我的脚本运行得很好,没有来自解释器的抱怨。现在,我不得不把我的脚本转移到一个新的web主机上,在PHP7.x下,解释器大声抱怨这个脚本的某一行,我正在寻找一种优雅的方法让它闭嘴

令人不快的是:-

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


示例坐标:'-97.74019'或'-97 44.411'或'-97 44 24.7'

该行给出了一个
E_通知(“通知:第1行命令行代码中未定义的偏移量:X”)。您可以将错误报告级别更改为不包含
E_NOTICE
,也可以使用
@
运算符隐藏或禁用此特定行的错误报告。在这里使用
@
没有害处。不匹配的变量将被赋值为NULL(在5和7中):

给出:

string(1) "x"
string(1) "y"
NULL
我一般不建议这样做,但要抑制所有
E\u通知
错误通知,可以在错误报告设置中取消设置:

ini_set("error_reporting", E_ALL&~E_NOTICE);

该行给出了一个
E_通知(“通知:第1行命令行代码中未定义的偏移量:X”)。您可以将错误报告级别更改为不包含
E_NOTICE
,也可以使用
@
运算符隐藏或禁用此特定行的错误报告。在这里使用
@
没有害处。不匹配的变量将被赋值为NULL(在5和7中):

给出:

string(1) "x"
string(1) "y"
NULL
我一般不建议这样做,但要抑制所有
E\u通知
错误通知,可以在错误报告设置中取消设置:

ini_set("error_reporting", E_ALL&~E_NOTICE);
您可以像下面这样转换代码:-

注意:-

另外,您的原始代码将只生成一个通知(如果错误报告也为此启用)。看这里:-

它不会停止程序执行,但您可以+必须通过上述代码来解决此通知

您可以按如下方式转换代码:-

注意:-

另外,您的原始代码将只生成一个通知(如果错误报告也为此启用)。看这里:-


它不会停止程序执行,但您可以+必须通过上述代码解决此通知

完全同意Anant,但您可以用更优雅的方式:

<?php

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

完全同意Anant,但您可以用更优雅的方式:

<?php

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

为什么不使用
array
$d\m\u s\u array=preg\u split(“//”,$coord)$度=0$分钟=0$秒=0;如果(!empty($d_m_s[0]){$degrees=$d_m_s[0];}。。。分钟和秒都是一样的
你能给我们展示一个
$coord
的示例值吗?使用这个:
@list($degrees,$minutes,$seconds)=preg_split(“/”,$coord)查看我的答案以了解详细信息。unclerojelio如果您有下面的答案,请检查它们并标记+投票一个答案为已接受。如果其他答案也有用,您也可以投票其他答案。谢谢为什么不使用
数组
$d_m_s_数组=preg_split(“/”,$coord)$度=0$分钟=0$秒=0;如果(!empty($d_m_s[0]){$degrees=$d_m_s[0];}。。。分钟和秒都是一样的
你能给我们展示一个
$coord
的示例值吗?使用这个:
@list($degrees,$minutes,$seconds)=preg_split(“/”,$coord)查看我的答案以了解详细信息。unclerojelio如果您有以下答案,请检查它们并将一个答案标记为已接受。如果其他答案也有用,您也可以将其标记为已接受。谢谢。这不是一个错误,而是一个通知。把它藏起来是完全合法的。PHP发出通知的行为是可预测的,OP和一般人都能很好地理解。如果你也能解决通知,为什么要跳过它呢。此外,OP表示,他的程序对此大喊大叫,这意味着通知的错误报告也在播放中。为什么要跳过。为什么不解决?跳过是我们的“解决”策略。只是因为它很容易,不会犯错;如果你知道是什么引起了这个通知,忽略它的后果到底是什么——在这种情况下,没有什么需要处理的,所以你明确地选择忽略它。很高兴OP有E_通知。这并不意味着报告的所有内容都需要详细处理!这不是错误,这是通知。把它藏起来是完全合法的。PHP发出通知的行为是可预测的,OP和一般人都能很好地理解。如果你也能解决通知,为什么要跳过它呢。此外,OP表示,他的程序对此大喊大叫,这意味着通知的错误报告也在播放中。为什么要跳过。为什么不解决?跳过是我们的“解决”策略。只是因为它很容易,不会犯错;如果你知道是什么引起了这个通知,忽略它的后果到底是什么——在这种情况下,没有什么需要处理的,所以你明确地选择忽略它。很高兴OP有E_通知。这并不意味着报告的所有内容都需要详细处理!