Php 转换值数组

Php 转换值数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个数组,看起来像这样 Array ( [0] => Array ( [code] => AS34 [2014-12-10] => 32 ) [1] => Array ( [code] => AS34 [2014-12-11] => 42 ) [2] => Arra

我有一个数组,看起来像这样

Array
(
    [0] => Array
        (
            [code] => AS34
            [2014-12-10] => 32
        )

    [1] => Array
        (
            [code] => AS34
            [2014-12-11] => 42
        )

    [2] => Array
        (
            [code] => AS34
            [2014-12-12] => 40
        )

    [3] => Array
        (
            [code] => AS34
            [2014-12-15] => 44
        )

    [4] => Array
        (
            [code] => AH98
            [2014-12-10] => 1
        )

    [5] => Array
        (
            [code] => AT78
            [2014-12-12] => 1
        )

    [6] => Array
        (
            [code] => AL44
            [2014-12-10] => 23
        )

    [7] => Array
        (
            [code] => AL44
            [2014-12-11] => 27
        )

    [8] => Array
        (
            [code] => AL44
            [2014-12-13] => 25
        )

    [9] => Array
        (
            [code] => AL44
            [2014-12-15] => 26
        )
)
var $example_data = array(
            array(
                'ID'        => 1,
                'code'     => 'AS34',
                '09/12/14'    => '0',
                '10/12/14'    => '32',
                '11/12/14'    => '42',
                '12/12/14'    => '40',
                '13/12/14'    => '0',
                '14/12/14'    => '0',
                '15/12/14'    => '44',
            ),
            array(
                'ID'        => 2,
                'code'     => 'AH98',
                '09/12/14'    => '0',
                '10/12/14'    => '1',
                '11/12/14'    => '0',
                '12/12/14'    => '0',
                '13/12/14'    => '0',
                '14/12/14'    => '0',
                '15/12/14'    => '0',
            ),
            array(
                'ID'        => 3,
                'code'     => 'AT78',
                '09/12/14'    => '0',
                '10/12/14'    => '0',
                '11/12/14'    => '0',
                '12/12/14'    => '1',
                '13/12/14'    => '0',
                '14/12/14'    => '0',
                '15/12/14'    => '0',
            ),
            array(
                'ID'        => 4,
                'code'     => 'AL44',
                '09/12/14'    => '0',
                '10/12/14'    => '23',
                '11/12/14'    => '27',
                '12/12/14'    => '0',
                '13/12/14'    => '25',
                '14/12/14'    => '0',
                '15/12/14'    => '26',
            ),
        );
我正试图把它变成一个数组,看起来像这样

Array
(
    [0] => Array
        (
            [code] => AS34
            [2014-12-10] => 32
        )

    [1] => Array
        (
            [code] => AS34
            [2014-12-11] => 42
        )

    [2] => Array
        (
            [code] => AS34
            [2014-12-12] => 40
        )

    [3] => Array
        (
            [code] => AS34
            [2014-12-15] => 44
        )

    [4] => Array
        (
            [code] => AH98
            [2014-12-10] => 1
        )

    [5] => Array
        (
            [code] => AT78
            [2014-12-12] => 1
        )

    [6] => Array
        (
            [code] => AL44
            [2014-12-10] => 23
        )

    [7] => Array
        (
            [code] => AL44
            [2014-12-11] => 27
        )

    [8] => Array
        (
            [code] => AL44
            [2014-12-13] => 25
        )

    [9] => Array
        (
            [code] => AL44
            [2014-12-15] => 26
        )
)
var $example_data = array(
            array(
                'ID'        => 1,
                'code'     => 'AS34',
                '09/12/14'    => '0',
                '10/12/14'    => '32',
                '11/12/14'    => '42',
                '12/12/14'    => '40',
                '13/12/14'    => '0',
                '14/12/14'    => '0',
                '15/12/14'    => '44',
            ),
            array(
                'ID'        => 2,
                'code'     => 'AH98',
                '09/12/14'    => '0',
                '10/12/14'    => '1',
                '11/12/14'    => '0',
                '12/12/14'    => '0',
                '13/12/14'    => '0',
                '14/12/14'    => '0',
                '15/12/14'    => '0',
            ),
            array(
                'ID'        => 3,
                'code'     => 'AT78',
                '09/12/14'    => '0',
                '10/12/14'    => '0',
                '11/12/14'    => '0',
                '12/12/14'    => '1',
                '13/12/14'    => '0',
                '14/12/14'    => '0',
                '15/12/14'    => '0',
            ),
            array(
                'ID'        => 4,
                'code'     => 'AL44',
                '09/12/14'    => '0',
                '10/12/14'    => '23',
                '11/12/14'    => '27',
                '12/12/14'    => '0',
                '13/12/14'    => '25',
                '14/12/14'    => '0',
                '15/12/14'    => '26',
            ),
        );
因此,基本上,它为每个“代码”和前7天设置了一个数组。有人能给我指出类似示例的方向吗?或者我应该使用的正确方法的一些阅读材料吗?

类似(固定):

我想:

$data = Array
(
    0 => Array
        (
            "id" => 1,
            "code" => "AS34",
            "2014-12-10" => 32
        ),

    1 => Array
        (
            "id" => 1,
            "code" => "AS34",
            "2014-12-11" => 42
        ),

    2 => Array
        (
            "id" => 1,
            "code" => "AS34",
            "2014-12-12" => 40
        ),

    3 => Array
        (
            "id" => 1,
            "code" => "AS34",
            "2014-12-15" => 44
        ),

    4 => Array
        (
            "id" => 1,
            "code" => "AH98",
            "2014-12-10" => 1
        ),

    5 => Array
        (
            "id" => 1,
            "code" => "AT78",
            "2014-12-12" => 1
        ),

    6 => Array
        (
            "id" => 1,
            "code" => "AL44",
            "2014-12-10" => 23
        ),

    7 => Array
        (
            "id" => 1,
            "code" => "AL44",
            "2014-12-11" => 27
        ),

    8 => Array
        (
            "id" => 1,
            "code" => "AL44",
            "2014-12-13" => 25
        ),

    9 => Array
        (
            "id" => 1,
            "code" => "AL44",
            "2014-12-15" => 26
        )
);

function in_array_r($needle, $haystack, $strict = false) { //taken from http://stackoverflow.com/a/4128377/4263082

    foreach ($haystack as $item) {

        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }

    }

    return false;
}

$codes = Array();
$counter = -1;

foreach($data as $key => $value) {

    if(!in_array_r($data[$key]["code"], $codes, true)) {

        $codes[++$counter] = Array();

        foreach($data[$key] as $subkey => $subvalue) {$codes[$counter][$subkey] = $subvalue;}

    }
    else{

        foreach($data[$key] as $subkey => $subvalue) {

            if($subkey != "code" && $subkey != "id") {$codes[$counter][$subkey] = $subvalue;}

        }

    }

}

print_r($codes);
输出

Array
(
    [0] => Array
        (
            [id] => 1
            [code] => AS34
            [2014-12-10] => 32
            [2014-12-11] => 42
            [2014-12-12] => 40
            [2014-12-15] => 44
        )

    [1] => Array
        (
            [id] => 1
            [code] => AH98
            [2014-12-10] => 1
        )

    [2] => Array
        (
            [id] => 1
            [code] => AT78
            [2014-12-12] => 1
        )

    [3] => Array
        (
            [id] => 1
            [code] => AL44
            [2014-12-10] => 23
            [2014-12-11] => 27
            [2014-12-13] => 25
            [2014-12-15] => 26
        )

)
我让这个工作:

<?php
header ('Content-type: text/plain; charset=utf-8');

//source data from the question
$sourceArr = array(
  array('id'            => 1
        ,'code'         => 'AS34'
        ,'2014-12-10'   => '32'
  )
  ,array('id'           => 1
         ,'code'        => 'AS34'
         ,'2014-12-11'  => '42'
  )
  ,array('id'           => 1
         ,'code'        => 'AS34'
         ,'2014-12-12'  => '40'
  )
  ,array('id'           => 1
         ,'code'        => 'AS34'
         ,'2014-12-15'  => '44'
  )
  ,array('id'           => 1
         ,'code'        => 'AH98'
         ,'2014-12-10'  => '1'
  )
  ,array('id'           => 1
         ,'code'        => 'AT78'
         ,'2014-12-12'  => '1'
  )
  ,array('id'           => 1
         ,'code'        => 'AL44'
         ,'2014-12-10'  => '23'
  )
  ,array('id'           => 1
         ,'code'        => 'AL44'
         ,'2014-12-11'  => '27'
  )
  ,array('id'           => 1
         ,'code'        => 'AL44'
         ,'2014-12-13'  => '25'
  )
  ,array('id'           => 1
         ,'code'        => 'AL44'
         ,'2014-12-15'  => '26'
  )
);

foreach($sourceArr as $k => $v)
{
  //get dates for last seven days
  $d0 = date('Y-m-d',time() - 60 * 60 * 24 * 0);
  $d1 = date('Y-m-d',time() - 60 * 60 * 24 * 1);
  $d2 = date('Y-m-d',time() - 60 * 60 * 24 * 2);
  $d3 = date('Y-m-d',time() - 60 * 60 * 24 * 3);
  $d4 = date('Y-m-d',time() - 60 * 60 * 24 * 4);
  $d5 = date('Y-m-d',time() - 60 * 60 * 24 * 5);
  $d6 = date('Y-m-d',time() - 60 * 60 * 24 * 6);

  //if we have a valid element - then save it in temp array
  if(array_key_exists($d0,$v)){ $tmpArr[$v['code']][$d0] = "'$v[$d0]'"; }
  if(array_key_exists($d1,$v)){ $tmpArr[$v['code']][$d1] = "'$v[$d1]'"; }
  if(array_key_exists($d2,$v)){ $tmpArr[$v['code']][$d2] = "'$v[$d2]'"; }
  if(array_key_exists($d3,$v)){ $tmpArr[$v['code']][$d3] = "'$v[$d3]'"; }
  if(array_key_exists($d4,$v)){ $tmpArr[$v['code']][$d4] = "'$v[$d4]'"; }
  if(array_key_exists($d5,$v)){ $tmpArr[$v['code']][$d5] = "'$v[$d5]'"; }
  if(array_key_exists($d6,$v)){ $tmpArr[$v['code']][$d6] = "'$v[$d6]'"; }

}

//create the result array
$cnt = 0;
foreach($tmpArr as $k => $v)
{
  $resultArr[$cnt]['ID'] = $cnt;
  $resultArr[$cnt]['code'] = "'$k'";
  asort($v);
  foreach($v as $k2 => $v2)
  {
    $resultArr[$cnt][$k2] = $v2;
  }
  $cnt++;
}

//output
echo "Old array: ".print_r($sourceArr,1);
echo "New array: ".print_r($resultArr,1);

?>

那么
'code'
属性是每个数组的唯一标识符吗?那么,在进行此操作之前,请先弄清楚:所有
id
都是相同的
1
?它们当前都设置为1,如果这使事情更容易,我可以更改此属性?只是询问一下(因为这确实使事情更容易)为什么名称ID始终为1的字段?这里$array代表什么?这是原始数组吗?我在这里测试了这种方法:它不获取日期键,只获取
code
id
。您可以使用该站点修复您的功能。看起来很不错。谢谢你的建议。日期现在是固定的,您可以在Runnable上测试它。我得到一个为$dataForEach()提供的无效参数。我在这里测试了它:我在答案中发布的输出来自该站点的测试结果。让我看看我在复制/粘贴时是否键入了什么。我使用了您问题中第一块代码中的数组。当然,为了通过解析,我做了一些更改,比如删除
[]
用引号包装键,提供逗号等,但是数据是一样的。您必须将该数组命名为
$data
。再说一遍:这是您的数组,我只需为它提供一个名称
$data
,并修复解析错误。另外,只要是2d数组,不同的数组也不应该是问题。如果需要解析print\u r的输出,这里有一个解决方案:请参阅此处注释中的函数print\u r\u reverse: