【问题标题】:Remove from array PHP从数组 PHP 中删除
【发布时间】:2012-11-07 01:27:56
【问题描述】:

我经常在数据上使用preg_match_all($pattern, $string, $matches),基本上,我总是需要从数组中删除 0.00 英镑或 0.00 美元或 0.00 欧元(如果它在其中)。

我永远不知道它在数组中的位置,如果有的话。

我尝试了unset($matches['£0.00'])unset($matches[0]['£0.00']),但没有成功

另外,是否可以不使用实际货币符号,也可以使用正则表达式\p{Sc}

所以,总结一下,我有一个带有货币符号的数字数组,需要删除所有零条目。

样本数组:

Array ( [0] => Array ( [0] => £18.99 [1] => £0.00 [2] => £0.00 [3] => £0.00 ) ) 

这可能吗?

【问题讨论】:

  • 你能给我们展示一下示例数组结构吗?
  • @MuthuKumaran - 嗨,添加示例
  • 你为什么不首先修改你的$pattern 使其不匹配?
  • 预期结果是什么?

标签: php regex preg-match-all


【解决方案1】:

preg_match()preg_match_all() 的用法有时会很奇怪

$matches 将是匹配模式的数组 - 在这种情况下,如果您

preg_match("/\p{Sc}0\.00/","£0.00",$matches);
//$matches[0] => £0.00

或者,如果您在模式中添加括号 (),您可以提取一部分

preg_match("/\p{Sc}(0\.00)/","£0.00",$matches);
//$matches[0] => £0.00
//$matches[1] => 0.00

所以要解决这个问题试试这个

foreach($sample_array as $key => $value)
{
     if(preg_match("/(\$|\p{Sc})0\.00/",$value))
     {
          unset($sample_array[$key]);
     }
}

注意管道 | 表示 $£ - 如果您为欧元符号添加另一个管道,它也会捕获该管道 - 还要注意我们是 unset()- 在原始密钥中数组而不是 unset()-ing $matches 数组

【讨论】:

  • 谢谢你,那么我是否可以改变我的原始模式以在源头停止它而不是再次运行 preg_match ?当前模式:$pattern = '/\p{Sc}\s*\d{1,3}(?:,\d{3})*(?:\.\d+)?/u';
  • 可能 - 看起来您在 2 个单独的括号中取出数字 - 通过执行 var_dump($matches)print_r($matches) 来检查 $matches 的值
【解决方案2】:
function remove_element($arr, $val)

        {

            foreach ($arr as $key => $value)

            {

                if ($arr[$key] == $val)

                {

                unset($arr[$key]);

                }

            }

            return $arr = array_values($arr);

        }

你可以使用这个函数,这些函数在删除指定值后返回数组元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 2013-01-02
    • 1970-01-01
    • 2019-08-05
    • 2011-04-04
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多