【问题标题】:preg_split to unknown number of list() elementspreg_split 到未知数量的 list() 元素
【发布时间】:2021-07-14 04:12:15
【问题描述】:

我有一个大概 10 年前编写的 PHP 脚本。我不记得当时 PHP 的版本是什么,但我的脚本运行良好,没有解释器的抱怨。现在,我不得不将我的脚本移动到一个新的网络主机上,并且在 PHP 7.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”

【问题讨论】:

  • 为什么不使用array
  • $d_m_s_array = preg_split("/ /", $coord); $degrees = 0; $minutes=0; $seconds=0; if (!empty($d_m_s[0])){$degrees = $d_m_s[0];} ... same for minute and second
  • 你能告诉我们$coord的样本值吗?
  • 使用这个:@list($degrees, $minutes, $seconds) = preg_split("/ /", $coord); 详情见我的回答。
  • unclerojelio 您在下面有答案,检查它们并将其中一个答案标记为已接受。如果其他答案也有用,您也可以对其进行投票。谢谢

标签: php preg-split


【解决方案1】:

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

<?php

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这不是错误,而是通知。隐藏它是完全合法的。 PHP 发出通知的行为是可预测的,并且被 OP 很好理解,并且通常......
    • 如果您也能够解决通知,那么为什么要跳过它。 OP 还说他的程序正在大喊大叫,这意味着通知的错误报告也在进行中。那么为什么要跳过。为什么不解决呢?
    • 跳过我们的“解决”策略。只是因为它很容易不会出错;如果您知道导致通知的原因以及忽略它的确切后果是什么 - 在这种情况下,没有什么可处理的,因此您明确选择忽略它。 OP 开启了 E_NOTICE 真是太好了。这并不意味着报告的所有内容都需要详细处理!
    【解决方案3】:

    您可以像下面这样转换该代码:-

    $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

    它不会停止程序的执行,但是你可以+必须-通过上面的代码来解决这个通知

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-02-01
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多