2

在 Count() 的返回值下

返回 var 中的元素个数。如果 var 不是数组或实现了 Countable 接口的对象,则返回 1。有一个例外,如果 var 为 NULL,则返回 0。

我有一个用字母和数字填充的字符串,我正在使用 preg_match_all() 来提取这些数字。我记得 preg_match_all 用结果填充第三个参数中给出的数组的内容。为什么返回 1?

我在我的代码中做错了什么?

$string = "9hsfgh563452";
preg_match_all("/[0-9]/",$string,$matches);

echo "Array size: " . count($matches)."</br>"; //Returns 1
echo "Array size: " . sizeof($matches)."</br>"; //Returns 1
print_r($matches);

我想对数组的内容(即字符串中返回的所有数字)求和,array_sum() 不起作用;它是一个字符串数组,我不知道如何将其转换为 int 数组,因为我没有使用任何分隔符,如 ' 、 ' 等。有没有更有效的方法来做到这一点?

帮助表示赞赏。

4

4 回答 4

4

计数为 1,因为$matches它是一个包含另一个数组的数组。具体来说,$matches[0]是一个包含第零个捕获组(整个正则表达式)的每个匹配项的数组。

也就是说,$matches看起来像这样:

Array
(
    [0] => Array  // The key "0" means that matches for the whole regex follow
        (
            [0] => 9   // and here are all the single-character matches
            [1] => 5
            [2] => 6
            [3] => 3
            [4] => 4
            [5] => 5
            [6] => 2
        )

)
于 2013-04-12T22:29:58.550 回答
3

的结果preg_match_all实际上是一个数组的数组:

Array
(
    [0] => Array
        (
            [0] => 9
            [1] => 5
            [2] => 6
            [3] => 3
            [4] => 4
            [5] => 5
            [6] => 2
        )
)

因此,您需要执行以下操作:

echo "Array size: " . count($matches[0]);

echo "Array sum: " . array_sum($matches[0]);
于 2013-04-12T22:30:07.420 回答
0

这是由于 preg_match_all 返回结果的方式。它的主要数组元素是 preg 括号(表达式匹配),而它们的内容是您匹配的内容。

在您的情况下,您没有子表达式。因此,该数组将只有一个元素 - 该元素将包含您的所有数字。

总结一下,只需这样做:

$sum = 0;
$j = count($matches[0]);
for ($i = 0; i < $j; ++$i) {
  $sum += (int)$matches[0][$i];
}
于 2013-04-12T22:31:33.287 回答
0

尝试使用 $matches[0] 而不是 $matches(返回 7)。

然后,如果您想对所有数字求和,可以使用 foreach 函数

于 2013-04-12T22:32:10.727 回答