PHP сравнивает итоги из многомерного массива - PullRequest
0 голосов
/ 27 декабря 2011

Массив, представленный ниже, имеет значения для трех последовательных дат. Я пытаюсь вычислить разницу между суммой значений за первую дату и суммой значений за вторую дату, а также суммой значений за третью дату.

Любые предложения о том, как лучше всего это сделать? Спасибо.

Array
(
[Nov 18, 2011] => Array
    (
        [C] => Array
            (
                [C] => Array
                    (
                        [T] => 50803.805765535
                    )
                [S] => Array
                    (
                        [T] => 32908.863528
                    )
            )
    )
[Dec 11, 2011] => Array
    (
        [C] => Array
            (
                [C] => Array
                    (
                        [T] => 31746.502038235
                    )
                [S] => Array
                    (
                        [T] => 16836.613004414
                    )
            )
      )
[Dec 24, 2011] => Array
    (
        [C] => Array
            (
                [C] => Array
                    (
                        [T] => 43524.786543288
                    )
                [S] => Array
                    (
                        [T] => 15722.772389011
                    )
            )
      )
)

Ответы [ 2 ]

0 голосов
/ 27 декабря 2011

Я не уверен, что правильно понимаю вашу проблему на 100%, но вот попытка. Если массив равен $ a, функция array_value_recursive () будет извлекать только значения 'T' для каждой даты, а затем отображать разницу между ними. Вывод выглядит так:

Nov 18, 2011 (C 50803.805766 / S 32908.863528) - Dec 11, 2011 (C 31746.502038 / S 16836.613004) = C 19057.303727 / S 16072.250524
Dec 11, 2011 (C 32908.863528 / S 31746.502038) - Dec 24, 2011 (C 16836.613004 / S 43524.786543) = C 16072.250524 / S -11778.284505

Код:

$keys = array_keys($a);
$values = array_value_recursive('T',$a);

for($i=0;$i<count($keys);$i++) {
    if (isset($keys[$i+$i])) {
        printf( "%s (C %f / S %f) - %s (C %f / S %f) = C %f / S %f\n",
            $keys[$i], $values[$i+$i], $values[$i+$i+1],
            $keys[$i+1], $values[$i+$i+2], $values[$i+$i+3],
            $values[$i+$i] - $values[$i+$i+2],
            $values[$i+$i+1] - $values[$i+$i+3] 
            );
    }
}

function array_value_recursive($key, array $arr){
    $val = array();
    array_walk_recursive($arr, function($v, $k) use($key, &$val){
        if($k == $key) array_push($val, $v);
    });
    return count($val) > 1 ? $val : array_pop($val);
}

edit : обновлены цикл и значения после исправления

0 голосов
/ 27 декабря 2011

Если ваш массив называется $ arr:

$totals = array();

foreach ($arr as $key => $val){

  $totals[$key] = $val['C']['C']['T'] + $val['C']['S']['T'];
}

print_r($totals);
exit;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...