как уменьшить часть в значении массива? - PullRequest
0 голосов
/ 05 августа 2011

у меня есть массив в формате

array() {["2011-07-29"]=> 39 ["2011-07-30"]=> 39 ["2011-07-31"]=> 39 ["2011-08-01"]=> 40}

Мне нужно t0 уменьшить среднее значение ключа на 1, т.е. ["2011- 07 -29"] до ["2011- 06 -29" ]

вывод должен быть

array() {["2011-06-29"]=> 39 ["2011-06-30"]=> 39 ["2011-06-31"]=> 39 ["2011-07-01"]=> 40}

как это сделать?

Ответы [ 6 ]

2 голосов
/ 05 августа 2011

Как объяснил Fernaref: измените ключи в соответствии с вашими потребностями, проанализировав их значение.Есть несколько способов сделать это, это только один пример ( Demo ):

<?php

$data = array(
  '2011-07-29' => 39,
  '2011-07-30' => 39,
  '2011-07-31' => 39,
  '2011-08-01' => 40,
);

$keys = array_keys($data);

foreach($keys as &$key)
{
    list(,$month) = sscanf($key, '%d-%d-%d');
    $month = sprintf("%02d", $month-1);
    $key[5] = $month[0];
    $key[6] = $month[1];
}
unset($key);

$data = array_combine($keys, $data);

print_r($data);
1 голос
/ 05 августа 2011

Это строка - вам придется проанализировать данные, уменьшить значение и собрать ключ обратно. Или используйте лучший ключ в первую очередь.

0 голосов
/ 05 августа 2011
$input = array("2011-07-29"=>39, "2011-07-30"=>39, "2011-07-31"=>39, "2011-08-01"=>40);
$output = array();

foreach($input as $key => $value) {
    $key = preg_replace_callback("/(\d{4})-(\d{2})-/", function($match) {
        $match[2] = (int) $match[2] - 1;
        if( $match[2] < 1 ) { // don't forget to decrement the year, if the month goes below 1
            $match[1] = (int) $match[1] - 1;
            $match[2] = 12;
        }
        return $match[1] . "-" . str_pad($match[2], 2, "0", STR_PAD_LEFT) . "-";
    }, $key);
    $output[$key] = $value;
}

print_r($output);
0 голосов
/ 05 августа 2011

некоторая функция может быть

preg_replace("@(\d\d\d\d)-(\d\d)@e","'\$1-'.str_pad($2-1, 2, '0', STR_PAD_LEFT)",$key);
0 голосов
/ 05 августа 2011

попробуйте это:

$result = array();
foreach ($array as $key => $val) {
  $date = strtotime ($key);

  $result[date("Y-m-d", strtotime("- month", $date)] = $val;
}
0 голосов
/ 05 августа 2011
$newArray = array();
foreach ($array as $key => $value)
{
  $newKey = someFunction($key);
  $newArray[$newKey] = $value;
}

Пока «someFunction» преобразует вашу дату, чтобы создать новый ключ

...