在多维数组中查找匹配项

问题描述 投票:0回答:5

我有一个包含不同格式的电话号码的数组:

$myArr[0][0] == '122-33-2222';
$myArr[1][0] == '(122) 433-5555';
$myArr[2][0] == '122 644.8888';

我需要检查该数组中是否有另一个数字。我假设我需要在比较之前循环遍历数组并去除所有非数字值。

$findNumber = 122.433.5555;
$varPhone = preg_replace("/[^0-9,.]/", "", $findNumber);

foreach ($myArr AS $phone) {
   if (preg_replace("/[^0-9,.]/", "", $phone) == $varPhone) {
      echo "found";
   } else {
      echo "not found";
   }
}

我想我已经很接近了,但还没有完全实现。我错过了什么?

php arrays
5个回答
2
投票

您的代码存在一些问题,请尝试以下操作:

$myArr[0][0] = '122-33-2222';
$myArr[1][0] = '(122) 433-5555';
$myArr[2][0] = '122 644.8888';

$findNumber = "122.433.5555";

$varPhone = preg_replace("/[^0-9]/", "", $findNumber);

foreach ($myArr AS $phone)
{
   $phone = preg_replace("/[^0-9]/", "", $phone);

   if ($phone[0] == $varPhone)
   {
        echo "found";
   }
   else
   {
      echo "not found";
   }
}

从正则表达式中删除

,
.
,并且由于
$phone
是一个数组,因此将其视为数组。

输出:

not foundfoundnot found

1
投票

电话号码位于每个第一级数组元素的键

[0]
中,因此无法直接比较
$phone
的每个实例。另外,我会替换所有非数字字符,以便不同的符号仍然显示为相同的数字。

<?php
// initialize array for the sake of this demo, to make this snippet work
$myArr = array(array(), array(), array());
$myArr[0][0] = '122-33-2222';
$myArr[1][0] = '(122) 433-5555';
$myArr[2][0] = '122 644.8888';

$findNumber = "122.433.5555";

function cleanNumber($in) {
  return preg_replace("/[^0-9]/", "", $in);
}

foreach ($myArr AS $phone) {
   // the number is in the key [0] for each first-level array element
   if (cleanNumber($phone[0]) == cleanNumber($findNumber)) {
      echo "found<br>";
   } else {
      echo "not found<br>";
   }
}

这将输出:

not found
found
not found

1
投票

请检查以下可能有效的代码片段

<?php
$myArr[0] = '122-33-2222';
$myArr[1] = '(122) 433-5555';
$myArr[2]    = '122 644.8888';

$findNumber = "122.433.5555";
$varPhone = preg_replace("/[^0-9]/", "", $findNumber);
$flag = false;
foreach ($myArr AS $phone) {
   if (preg_replace("/[^0-9]/", "", $phone) == $varPhone) {
      $flag = true;
      break;

   } 
}

if($flag)
    echo "found";
else
    echo "not found";

?>

变化:- $myArr 应该是一维数组而不是二维数组,

== 是比较运算符,应使用赋值运算符。

在 preg_replace 中,即使是点也应该替换为空


0
投票

这是您的代码的工作示例:

$myArr[0][0] = '122-33-2222';
$myArr[1][0] = '(122) 433-5555';
$myArr[2][0] = '122 644.8888';

$findNumber = '122.433.5555';
$normalize = preg_replace("/[^0-9]/","", $findNumber);

$found = false;
foreach ($myArr AS $phone) {
  if ($normalize == preg_replace("/[^0-9]/","", $phone[0])) {
    $found = true;
    break;
  }
}

echo $found;

更好的方法是使用

array_filter

$myArr[0][0] = '122-33-2222';
$myArr[1][0] = '(122) 433-5555';
$myArr[2][0] = '122 644.8888';

$findNumber = '122.433.5555';
$normalize = preg_replace("/[^0-9]/","", $findNumber);

$filtered =array_filter($myArr, function ($phone) use ($normalize) {
  return preg_replace("/[^0-9]/","", $phone[0]) == $normalize;
});

var_dump($filtered);
echo sizeof($filtered);

0
投票

通过从needle值和所有haystack值中删除非数字字符,您可以可靠地比较电话号码。

从 PHP8.4 开始,

array_find()
可用于在通过条件循环中断找到第一个匹配项后立即返回 true 结果(否则返回 false)——这提供了代码优雅和最高效率。

也适用于 PHP8.4,

array_find_key()
将返回第一个匹配的键,如果未找到则返回 null。

PHP8.4 演示

$haystacks = [
    ['122-33-2222'],
    ['(122) 433-5555'],
    ['122 644.8888']
];

$findNumber = '122.433.5555';
$needle = preg_replace('/\D+/', '', $findNumber);

echo array_find(
         $haystacks,
         fn($row) => preg_replace('/\D+/', '', $row[0]) === $needle
     )
     ? 'Found'
     : 'Not found';

echo "\n";

var_export(
    array_find_key(
        $haystacks,
        fn($row) => preg_replace('/\D+/', '', $row[0]) === $needle
    )
);

输出:

Found
1
© www.soinside.com 2019 - 2024. All rights reserved.