在 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 数组,因为我没有使用任何分隔符,如 ' , ' 等。有更有效的方法吗?
计数为 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
)
)
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]);
这是由于 preg_match_all 返回结果的方式造成的。它的主要数组元素是 preg 括号(表达式匹配),而它们的内容是您匹配的内容。
在你的情况下,你没有子表达式。因此,该数组将只有一个元素 - 并且该元素将包含所有数字。
总结一下,只需这样做:
$sum = 0;
$j = count($matches[0]);
for ($i = 0; i < $j; ++$i) {
$sum += (int)$matches[0][$i];
}
尝试使用 $matches[0] 而不是 $matches(返回 7)。
如果你想对所有数字求和,你可以使用 foreach 函数