【问题标题】:Convert array of values转换值数组
【发布时间】:2014-12-15 23:13:38
【问题描述】:

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

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 天。任何人都可以指出类似示例的方向或阅读我应该使用的正确方法吗?

【问题讨论】:

  • 所以'code' 属性是每个数组的唯一标识符?
  • 所以,在继续之前先把所有事情弄清楚:所有id 都是相同的1
  • 它们目前都设置为1,如果它更容易我可以更改它吗?
  • 只是问(因为它确实让事情变得更容易)为什么会有一个名称 ID 始终为 1 的字段?

标签: php arrays multidimensional-array


【解决方案1】:

我想到了这个:

$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
        )

)

【讨论】:

  • 我得到一个为 $data 的 foreach() 提供的无效参数
  • 我在这里进行了测试:writecodeonline.com/php 并且我在答案中发布的 OUTPUT 取自该站点中该测试的结果。让我看看我在复制/粘贴时是否打错了东西。
  • 我使用了您在问题的第一个代码块中拥有的数组。当然,我做了一些改变来传递解析,比如删除[]用引号包裹的键,提供逗号等。但数据是一样的。您必须将该数组命名为 $data
  • 再说一遍:这是你的数组,我只是给它一个名字$data 并修复解析错误。另外,只要是二维数组,不同的数组就不应该成为问题。
  • 如果您需要解析 print_r 的输出 - 这里有一个解决方案:stackoverflow.com/questions/14218698/… 在 cmets 中查看函数 print_r_reverse:php.net/manual/en/function.print-r.php
【解决方案2】:

类似(固定):

$example_data = array();
foreach($data as $id => $row) {
    $code = $row['code'];
    unset($row['code']);

    $karr = array_keys($row);
    $date = current($karr);

    $example_data[$code]['ID'] = $id;
    $example_data[$code]['code'] = $code;
    $example_data[$code][$date] = $row[$date];
}
print_r($example_data);

Test online

【讨论】:

  • $array 在这里代表什么?这是原始数组吗?
  • 我在这里测试了这种方法:writecodeonline.com/php,它没有得到日期键,只有codeid。您可以使用该站点来修复您的功能。它看起来可能是一个不错的选择。
  • 感谢@Varhaeren 的建议。日期现已确定,您可以在 Runnable 上进行测试。
【解决方案3】:

我得到了这个工作:

<?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);

?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    相关资源
    最近更新 更多