重组PHP数组结构(数组中的数组)


Reorganizing a PHP array structure (arrays within arrays)

我有这个数组中的数组,它包含了很多值:

  183 => 
    array (size=3)
      0 => string 'DE' (length=2)
      1 => string '2015-06-09' (length=10)
      2 => string 'GK' (length=2)   
  184 => 
    array (size=3)
      0 => string 'DE' (length=2)
      1 => string '2015-06-08' (length=10)
      2 => string 'GL' (length=2)   
  185 => 
    array (size=3)
      0 => string 'FR' (length=2)
      1 => string '2015-06-09' (length=10)
      2 => string 'GN' (length=2)   
  186 => 
    array (size=3)
      0 => string 'FR' (length=2)
      1 => string '2015-09-08' (length=10)
      2 => string 'GO' (length=2)

0为国家代码。1是一个日期。2是Excel文件中的一列。

我想这样组织:

2015-06-09 => 
  array (size=3)
    DE => 
      array (size=2)
        column => GK
        download => 666 
    FR => 
      array (size=2)
        column => GN
        download => 777 
2015-06-08 =>
  array (size=3)
    DE => 
      array (size=2)
        column => GL
        download => 666 
    FR => 
      array (size=2)
        column => GO
        download => 777 

所以同一个日期可以出现多次。如果它得到一个具有相同日期的数组值-它将在其中插入国家代码和它的'列。

如果超过1个国家,则添加一个新国家。(与"下载"和列值)。

我有这个功能:

function get_cols_to_array_by_date($array) { 
    $mainarr = array();
    $last_in_arr = count($array); 
    for ($i=0; $i<$last_in_arr; $i++){
            $mainarr[$array[$i][1]] = array( $array[$i][0]=> array('downloads'=> 666, 'col'=>$array[$i][2]) );

    }
    return $mainarr;

}

,它输出一个数组,该数组在到达相同日期时运行该国家,而不是给我一个国家数组。

我的代码中遗漏了什么部分?有更简单的方法吗?(PHP语法捷径;))

假设downloads是初始数组的键,每个元素有3个元素(日期和2个国家):

代码:

//demo array
    $old = array(
        555=>array(
          0 => 'DE',
          1 => '2015-06-09',
          2 => 'GK'), 
        234=>array(
          0 => 'DE',
          1 => '2015-06-08',
          2 => 'GL'),   
        123=>array(
          0 => 'FR', 
          1 => '2015-06-09',
          2 => 'GN')
          );  
    $new = array();   
    foreach($old as $key=>$arrayValues)
    {
        if(!array_key_exists($arrayValues[1], $new)){ //check if there is already a key by date
            $new[$arrayValues[1]] = array();
        }
        $new[$arrayValues[1]][$arrayValues[0]] = array('column'=>$arrayValues[2], 'downloads'=>$key); //append formated array
    }
    echo "<pre>";
    var_dump($new);
    echo "</pre>";
输出:

array(2) {
  ["2015-06-09"]=>
  array(2) {
    ["DE"]=>
    array(2) {
      ["column"]=>
      string(2) "GK"
      ["downloads"]=>
      int(555)
    }
    ["FR"]=>
    array(2) {
      ["column"]=>
      string(2) "GN"
      ["downloads"]=>
      int(123)
    }
  }
  ["2015-06-08"]=>
  array(1) {
    ["DE"]=>
    array(2) {
      ["column"]=>
      string(2) "GL"
      ["downloads"]=>
      int(234)
    }
  }
}

尝试循环并检查元素是否存在,如果不存在则添加。

$result = [];
foreach ($myArray as $key => $values) {
    if (!isset($result[$values[1]])) {
        $result[$values[1]] = [
            $values[0] => [
                'column' => $values[2],
                'download' => $key,
            ]
        ];
    } elseif (!isset($result[$values[1]][$values[0]])) {
        $result[$values[1]][$values[0]] = [
            'column' => $values[2],
            'download' => $key,
        ];
    }
}

沙箱