只需重新排列/重命名数组(php)


Simply rearrange/rename array (php)

我就是不明白,它实际上是如此基本,但我就是不能实现它。我有以下数组:

Array ( 
[15] => Array ( 
        [id] => 15 
        [name] => Name of course 
        [date] => 1300863780 
        [price] => 0 ) 
[14] => Array ( 
        [id] => 14  
        [name] => Name of course 
        [date] => 1303545780 
        [price] => 0 ) 
)

我只是想重新排列一下,让它看起来像:

Array ( 
[03] => Array ( 
        [id] => Array(15) 
        [name] => Array(Name of course)
        [day] => Array(23)
        [year] => Array(2011)
        [price] => Array(0) ) 
[04] => Array ( 
        [id] => Array(14) 
        [name] => Array(Name of course)
        [day] => Array(23)
        [year] => Array(2011)
        [price] => Array(0) ) 
)

解释一下:我想把月份(从[date]计算)作为主键,然后或多或少地列出每个字段对应的字段/一些新的字段。以后在同一个月里会有更多的条目,所以这样安排是有意义的。

我得到的是以下内容,为了foo的缘故,我不明白为什么它不能这样工作(并且没有其他方法我可以提出)。$this->data就是上面的数组!

<?php
    foreach($this->data as $field)
    { 
        while(list($id, $name, $date, $price) = each($field))
        {
            $month = date('m',$date);
            $this->month[$month]['id'] = $id;
            $this->month[$month]['name'] = $name;
            $this->month[$month]['day'] = date('F',$date);
            $this->month[$month]['year'] = date('Y',$date);
            $this->month[$month]['price'] = $price;
        }
    }
?>

我得到的只是在list()语句行中成堆的"未定义偏移"通知。非常感谢你的帮助!!

应该这样做:

$rearranged = array();
foreach ($this->data as $data) {
    $rearranged[date('m', $data['date'])][] = array(
        'id'    => array($data['id']),
        'name'  => array($data['name']),
        'day'   => array(date('F', $data['date'])),
        'year'  => array(date('Y', $data['date'])),
        'price' => array($data['price'])
    );
}

解释一下:我想让月份(从[date]计算)为主键,然后或多或少列出每个字段在他们的相应的字段/一些新的字段。以后还会有更多同一个月的条目,所以这样安排是有意义的。

正如我在评论中所写的,在读了这篇文章之后,我不会将所有这些id, name等存储为数组。$this->month[$month][$n]['id']是要走的路,而不是$this->month[$month]['id'][$n],也就是说,你需要多个"数组的id, name"而不是"单独的id数组,另一个name数组等"。

function convert(array $data) {
    $result = array();
    foreach ( $data as $value ) {
        $month = date('m', $value['date']);
        $value['day' ] = date('d', $value['date']);
        $value['year'] = date('Y', $value['date']);
        unset($value['date']);
        $result[$month][] = $value;
    }
    return $result;
}
$data = array(
    15 => array(
        'id'    => '15',
        'name'  => 'Name of course',
        'date'  => '1300863780',
        'price' => '0',
    ),
    16 => array(
        'id'    => '16',
        'name'  => 'Name of course',
        'date'  => '1300863780',
        'price' => '0',
    ),
    14 => array(
        'id'    => '14',
        'name'  => 'Name of course',
        'date'  => '1303545780',
        'price' => '0',
    ),
);
print_r(convert($data));
输出:

Array
(
    [03] => Array
        (
            [0] => Array
                (
                    [id] => 15
                    [name] => Name of course
                    [price] => 0
                    [day] => 23
                    [year] => 2011
                )
            [1] => Array
                (
                    [id] => 16
                    [name] => Name of course
                    [price] => 0
                    [day] => 23
                    [year] => 2011
                )
        )
    [04] => Array
        (
            [0] => Array
                (
                    [id] => 14
                    [name] => Name of course
                    [price] => 0
                    [day] => 23
                    [year] => 2011
                )
        )
)

遍历数组并相应地更改项。在此过程中,收集新的键名,然后合并新的数组(Demo):

$keys = array();
foreach($array as &$v)
{
    $keys[] = date('m', $v['date']);
    $v['day'] = date('d', $v['date']);
    $v['year'] = date('Y', $v['date']);
    unset($v['date']);
    foreach($v as &$v2)
        $v2 = array($v2);
    unset($v2);
}
unset($v);
$array = array_combine($keys, $array);