Не добавляйте значения, отформатированные с помощью number_format (), иначе они могут содержать разделитель тысяч ... они рассматриваются как строки, а не как числа с плавающей запятой.
Предполагая, что $ cash, $ card и $ check являются массивами:
$cash = array_sum($cash);
$card = array_sum($card);
$check = array_sum($check);
$total = number_format( $cash + $card + $check, 2 );
$cash = number_format( $cash, 2 );
$card = number_format( $card, 2 );
$check = number_format( $check, 2 );
Выполните любое форматирование после математики
EDIT
Используйте str_replace () вместо preg_replace(), чтобы убрать любой $, тогда это простое добавление, а не необходимость выполнять array_sum (), хотя я не уверен, откуда может возникнуть любой $, если значения DECIMAL 10,7 из базы данных
$cash = (float) str_replace( array('$',','), '', $cash );
$card = (float) str_replace( array('$',','), '', $card );
$check = (float) str_replace( array('$',','), '', $check );
$total = number_format( $cash + $card + $check, 2 );
$cash = number_format( $cash, 2 );
$card = number_format( $card, 2 );
$check = number_format( $check, 2 );
(предполагается, что это ваш разделитель тысяч в строковых значениях для $ cash, $ card и $ check при выполнении str_replace ()
EDIT 2
Чтобы преобразовать массив $ cash в сумму его значений, очистив любой $ или, в строках:
$cash = array ( 0 => '$1729.13', 1 => '0.00', 2 => '$1,234.56' );
function cleanArrayValues($value) {
return (float) str_replace( array('$',','), '', $value );
}
$cash = array_sum(array_map('cleanArrayValues',$cash));
Я добавил дополнительное значение в массив $ cash просто для
Вам нужно будет отфильтровать чеки $ card и $ вТочно так же, используя функцию обратного вызова cleanArrayValues () (если они все массивы)