在此处获取未定义的偏移量错误 - 显然来自$ newval数组。
请注意,{exp}标签不是PHP,只是我的CMS系统的一个SQL查询,它为我创建了$ bags数组。
<?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;
?>
答案 0 :(得分:2)
在连接变量之前,该变量必须存在(以避免Notice
)。只需在$newval[$key]
循环之前将for
声明为空字符串:
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;
}
}
答案 1 :(得分:1)
正如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;
?>
答案 2 :(得分:1)
而不是这个
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);
一行比六行更容易调试,不是吗。