Получение ошибки Undefined Offset здесь – видимо, из массива $ newval.
Обратите внимание, что тег {exp} не является PHP и представляет собой просто sql-запрос моей системы CMS, который создает для меня массив $ 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; ?>
Прежде чем вы сможете объединить переменную, эта переменная должна существовать (чтобы избежать 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; } }
Поскольку 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);
одна строка легче отлаживать, чем шесть, не так ли.