Просто переставить / переименовать массив (php) - PullRequest
0 голосов
/ 03 октября 2011

Я просто не понимаю, на самом деле это так просто, но я просто не могу этого сделать.У меня есть следующий массив:

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

Чтобы объяснить это: я хочу сделатьмесяц (рассчитывается от [дата]), чтобы быть основным ключом, а затем более или менее перечислить каждое поле в соответствующих полях / некоторые новые.Позже будет больше записей в том же месяце, поэтому имеет смысл упорядочить это так.

То, что я получил, пока следующее, и ради 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 ().Очень ценю вашу помощь !!

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

Это должно сделать:

$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'])
    );
}
1 голос
/ 03 октября 2011

Чтобы объяснить это: я хочу сделать месяц (рассчитанный из [date]) главным ключом, а затем более или менее перечислить каждое поле в соответствующих полях / некоторые новые.Позже в том же месяце будет больше записей, поэтому имеет смысл упорядочить их таким образом.

Как я писал в комментарии, после прочтения этого я не буду хранить все эти idname и т. Д. Как массивы.$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
                )
        )
)
1 голос
/ 03 октября 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);
...