PHP错误,数组被定义


Undefined Offset PHP error, arrays are defined

在这里得到一个未定义的偏移错误-显然来自$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);

一行比六行更容易调试,不是吗?