2015-10-09 4 views
0

У меня есть этот массив:Заполните «пробелы» в многомерном массиве в PHP

Array 
(
    [0] => Array 
     (
      [c] => Array 
       (
        [0] => Array 
         (
          [v] => 28 
         ) 

        [1] => Array 
         (
          [v] => 1422.00 
         ) 

       ) 

     ) 

    [1] => Array 
     (
      [c] => Array 
       (
        [0] => Array 
         (
          [v] => 29 
         ) 

        [1] => Array 
         (
          [v] => 480.00 
         ) 

       ) 

     ) 

    [2] => Array 
     (
      [c] => Array 
       (
        [0] => Array 
         (
          [v] => 31 
         ) 

        [1] => Array 
         (
          [v] => 1472.00 
         ) 

       ) 

     ) 

    [3] => Array 
     (
      [c] => Array 
       (
        [0] => Array 
         (
          [v] => 32 
         ) 

        [1] => Array 
         (
          [v] => 910.00 
         ) 

       ) 

     ) 

    [4] => Array 
     (
      [c] => Array 
       (
        [0] => Array 
         (
          [v] => 33 
         ) 

        [1] => Array 
         (
          [v] => 740.00 
         ) 

       ) 

     ) 

    [5] => Array 
     (
      [c] => Array 
       (
        [0] => Array 
         (
          [v] => 34 
         ) 

        [1] => Array 
         (
          [v] => 380.00 
         ) 

       ) 

     ) 

    [6] => Array 
     (
      [c] => Array 
       (
        [0] => Array 
         (
          [v] => 35 
         ) 

        [1] => Array 
         (
          [v] => 640.00 
         ) 

       ) 

     ) 

    [7] => Array 
     (
      [c] => Array 
       (
        [0] => Array 
         (
          [v] => 36 
         ) 

        [1] => Array 
         (
          [v] => 340.00 
         ) 

       ) 

     ) 

    [8] => Array 
     (
      [c] => Array 
       (
        [0] => Array 
         (
          [v] => 37 
         ) 

        [1] => Array 
         (
          [v] => 1490.00 
         ) 

       ) 

     ) 

    [9] => Array 
     (
      [c] => Array 
       (
        [0] => Array 
         (
          [v] => 38 
         ) 

        [1] => Array 
         (
          [v] => 710.00 
         ) 

       ) 

     ) 

    [10] => Array 
     (
      [c] => Array 
       (
        [0] => Array 
         (
          [v] => 39 
         ) 

        [1] => Array 
         (
          [v] => 810.00 
         ) 

       ) 

     ) 

    [11] => Array 
     (
      [c] => Array 
       (
        [0] => Array 
         (
          [v] => 40 
         ) 

        [1] => Array 
         (
          [v] => 3152.00 
         ) 

       ) 

     ) 

) 

Как вы можете заметить, V начинается с 28 (это Num недели в выбранный год) и неделя 30 отсутствует.

Другим запросом базы данных может, конечно, вернуть другой результат, с другими (или нет) «пробелами».

Как я могу «заполнить» эти пробелы? (Если интересно, я знаю также максимальное количество недель в году, 52 или 53).

спасибо.

РЕДАКТИРОВАТЬ

Я бы массив в качестве результата в качестве следующего, с «30», вставленной в массиве, и значение на «0,00» (см ниже):

Array 
    (
     [0] => Array 
      (
       [c] => Array 
        (
         [0] => Array 
          (
           [v] => 28 
          ) 

         [1] => Array 
          (
           [v] => 1422.00 
          ) 

        ) 

      ) 

     [1] => Array 
      (
       [c] => Array 
        (
         [0] => Array 
          (
           [v] => 29 
          ) 

         [1] => Array 
          (
           [v] => 480.00 
          ) 

        ) 

      ) 

      [2] => Array 
      (
       [c] => Array 
        (
         [0] => Array 
          (
           [v] => 30 
          ) 

         [1] => Array 
          (
           [v] => 0.00 
          ) 

        ) 

      ) 
+0

Что именно вы хотите? список отсутствующих цифр? (30 в этом примере) –

+0

ОК, вы правы. Мне нужен конечный массив с пробелами, заполненными. Не список, а один массив «полный» (и значение V до 0,00, причина не указаны для этой недели). Спасибо! – sineverba

+0

Гарантируется, что элементы в «foreach-order» имеют строго восходящие значения для '[0] v'? И было бы нормально использовать '[0] v' в качестве ключа для внешнего массива вместо 0,1,2,3 ...? – VolkerK

ответ

0

Здесь это решение, которое предполагает правильный формат входного массива.

$org = array(
["c"=>[["v"=>28],["v"=>1422.00]]], 
["c"=>[["v"=>29],["v"=>480.00]]], 
["c"=>[["v"=>31],["v"=>1234.00]]], 
["c"=>[["v"=>35],["v"=>432.00]]] 
// etc 
); 

$fixed = fixMe($org); 

// I am expecting an array structured as in your example, so I am too lazy to check for errors. 
function fixMe($arr){ 
    $foundWeekNums = array(); 
    foreach ($arr as $ind => $arr_1){ 
     $foundWeekNums[$arr_1["c"][0]["v"]] = $arr_1["c"][1]["v"]; 
    } 

    // $keys are found weeknums 
    $keys = array_keys($foundWeekNums); 

    $formWeekNum = min($keys); 
    $toWeekNum = max($keys); 

    $newArr = array(); 

    for ($week = $formWeekNum; $week <= $toWeekNum; $week++){ 
     if (in_array($week, $keys)){ 
      $val = $foundWeekNums[$week]; 
     } else { 
      $val = 0; 
     } 
     $newArr[] = ["c" => [["v" => $week],["v" => $val]]]; 
    } 
    return $newArr; 
} 

echo "<pre>"; 
print_r($org); 
echo "</pre>"; 

echo "<hr><pre>"; 
print_r($fixed); 
echo "</pre>"; 

PS: Если вы хотите, чтобы заполнить до 52 или 53, просто поместить эту цифру в этом месте:

$toWeekNum = max($keys); 
0

Так много возможных путей ... вот только два ...

простой прямолинейный

<?php 
$arr = array(
    array('c'=>array(array('v'=>28), array('v'=>'1422.00'))), 
    array('c'=>array(array('v'=>29), array('v'=>'480.00'))), 
    array('c'=>array(array('v'=>31), array('v'=>'1472.00'))), 
    array('c'=>array(array('v'=>40), array('v'=>'3152.00'))) 
); 

$result = array(); 
$previous = current($arr)['c'][0]['v'] - 1 ; // you have to split this up into two statements if php version < 5.6 
foreach($arr as $w) { 
    while(++$previous < $w['c'][0]['v']) { 
     $result[] = array('c'=>array(array('v'=>$previous), array('v'=>'0.00'))); 
    } 
    $result[] = $w; 
} 

var_export($result); 

и один немного больше удовольствия ....

<?php 
// see http://docs.php.net/class.arrayaccess 
class Foo implements ArrayAccess { 
    protected $data; 
    protected $index; 
    protected $year; 
    protected $maxWeek; 

    public function __construct($year, $weekRecords) { 
     $this->data = $weekRecords; 
     foreach($weekRecords as $k=>$e) { 
      $w = $e['c'][0]['v']; 
      $this->index[$w] = $k; 
     } 
     $this->year = $year; 
     $dt = new DateTime('31.12.'.$year); 
     $this->maxWeek = intval($dt->format('W')); // assuming ISO-week 
    } 

    public function offsetExists($offset) { 
     return $offset > 0 && $offset < $this->maxWeek; 
    } 

    public function offsetGet($offset) { 
     return isset($this->index[$offset]) ? 
      $this->data[ $this->index[$offset] ] 
      : array('c'=>array(array('v'=>$offset), array('v'=>'0.00'))); 
    } 

    public function offsetSet ($offset, $value) { 
     trigger_error('offsetSet not implemented', E_USER_ERROR); 
    } 

    public function offsetUnset ($offset) { 
     trigger_error('offsetSet not implemented', E_USER_ERROR); 
    } 
} 

/* ************ */ 
$arr = array(
    array('c'=>array(array('v'=>28), array('v'=>'1422.00'))), 
    array('c'=>array(array('v'=>29), array('v'=>'480.00'))), 
    array('c'=>array(array('v'=>31), array('v'=>'1472.00'))), 
    array('c'=>array(array('v'=>40), array('v'=>'3152.00'))) 
); 

$foo = new Foo(2015, $arr); 
for($i=28; $i<45; $i++) { 
    var_export($foo[$i]); 
} 

хотя вы, вероятно, также захотите реализовать Traversable.

Смежные вопросы