PHP - 数组大小返回1?

时间:2013-04-12 22:26:56

标签: php arrays

在Count()的返回值下

  

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

我有一个用字母和数字填充的字符串,我使用preg_match_all()来提取这些数字。我记得preg_match_all用结果填充第3个参数中给出的数组的内容。为什么它会返回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 个答案:

答案 0 :(得分: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
        )

)

答案 1 :(得分: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]);

答案 2 :(得分:0)

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

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

总结一下,只需这样做:

$sum = 0;
$j = count($matches[0]);
for ($i = 0; i < $j; ++$i) {
  $sum += (int)$matches[0][$i];
}

答案 3 :(得分:0)

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

然后,如果你想总结所有数字,你可以使用foreach函数