未定义的偏移PHP错误,定义了数组

时间:2011-08-17 19:44:54

标签: php

在此处获取未定义的偏移量错误 - 显然来自$ 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;

?>

3 个答案:

答案 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);

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

相关问题