在这里得到一个未定义的偏移错误-显然来自$newval数组
请注意,{exp}标签不是PHP,只是我的CMS系统为我创建$bags数组的sql查询。
<?php
$bags = array();
$newval = array();
$pattern = "[^0-9]";
{exp:query sql="SELECT m_field_id_1 as bags FROM exp_member_data WHERE m_field_id_1 IS NOT NULL"}
$bags[] = "{bags}";
{/exp:query}
foreach ($bags as $key => $value) {
for ( $i = 0, $s = strlen($value); $i < $s; $i++) {
if ( is_numeric($value[$i]) ) {
$newval[$key] .= $value[$i];
}
}
}
$sum = array_sum($newval);
$format = number_format($sum);
echo $format;
?>
在连接到变量之前,该变量必须存在(以避免Notice
)。只需在for
循环之前将$newval[$key]
声明为空字符串:
foreach ($bags as $key => $value) {
$newval[$key] = '';
for ($i = 0, $s = strlen($value); $i < $s; $i++) {
if ( is_numeric($value[$i]) ) {
$newval[$key] .= $value[$i];
}
}
}
顺便说一下,$i
的初始值没有问题。把它放在0
而不是其他人建议的1
是正确的。
但是,如果您试图从字符串中删除非数字字符并避免空数组元素(正如您的原始代码所做的那样),您可以删除内部for
循环并简单地:
foreach ($bags as $key => $value) {
$digits = preg_replace('/[^0-9]/', '', $value);
if (strlen($digits)) {
$newval[$key] = $digits;
}
}
正如Jrod所说,你在$value
中行走,但你从0开始。strlen()
返回$value中的绝对字符数,因此在for循环中应该从1开始,而不是从0开始。
<?php
$bags = array();
$newval = array();
$pattern = "[^0-9]";
{exp:query sql="SELECT m_field_id_1 as bags FROM exp_member_data WHERE m_field_id_1 IS NOT NULL"}
$bags[] = "{bags}";
{/exp:query}
foreach ($bags as $key => $value) {
$newval[$key] = '';
for ( $i = 1, $s = strlen($value); $i < $s; $i++) {
if ( is_numeric($value[$i]) ) {
$newval[$key] .= $value[$i];
}
}
}
$sum = array_sum($newval);
$format = number_format($sum);
echo $format;
?>
代替
foreach ($bags as $key => $value) {
for ( $i = 0, $s = strlen($value); $i < $s; $i++) {
if ( is_numeric($value[$i]) ) {
$newval[$key] .= $value[$i];
}
}
}
你可以写
$newval = preg_replace('~'D+~', '', $bags);
一行比六行更容易调试,不是吗?