2013-06-14 3 views
0

Я потянув данные из БД в формате:PHP: лучший способ создания многомерных массивов?

Array 
(
    [id] => 1 
    [exerciseid] => 127 
    [date] => 2013-06-12 00:00:00 
    [time] => 40271 
    [weight] => 
    [distance] => 1000 
    [reps] => 
    [intensity] => 
) 
Array 
(
    [id] => 2 
    [exerciseid] => 127 
    [date] => 2013-06-12 00:00:00 
    [time] => 120813 
    [weight] => 
    [distance] => 1000 
    [reps] => 
    [intensity] => 
) 

Теперь я хочу, чтобы объединить эти массивы и создавать многомерные массивы если матче exerciseid в. Я сделал это:

Array 
(
    [127] => Array 
     (
      [1] => Array 
       (
        [time] => 40271 
        [weight] => 
        [distance] => 1000 
        [reps] => 
        [intensity] => 
       ) 

      [2] => Array 
       (
        [time] => 120813 
        [weight] => 
        [distance] => 1000 
        [reps] => 
        [intensity] => 
       ) 

     ) 

) 

Мой вопрос в том, есть ли лучший способ написать это, чем то, что у меня есть?

while($e = $db->fetch()) { 
     foreach ($e as $key => $value) { 

      if($key == 'id') 
       $id = $value; 

      else if($key == 'exerciseid') 
       $exerciseid = $value; 

      else if($key == 'time') 
       $time = $value; 

      else if($key == 'weight') 
       $weight = $value; 

      else if($key == 'distance') 
       $distance = $value; 

      else if($key == 'reps') 
       $reps = $value; 

      else if($key == 'intensity') 
       $intensity = $value; 

     } 

     $a[$exerciseid][$id]['time'] = $time; 
     $a[$exerciseid][$id]['weight'] = $weight; 
     $a[$exerciseid][$id]['distance'] = $distance; 
     $a[$exerciseid][$id]['reps'] = $reps; 
     $a[$exerciseid][$id]['intensity'] = $intensity; 

    } 
+1

ничего себе! thats много 'IF ELSE блоков' лучше сделать это в' switch Case' :) –

+0

Используйте «case» вместо «if else» – maximkou

+1

Вы пытались 'while ($ e = $ db-> fetch()) {$ a [$ e ['exerciseid]] [] = $ e; } '? Это однострочный, который делает то же самое. – Jon

ответ

2
while ($e = $db->fetch()) { 
    $exerciseid = $e['exerciseid']; 
    $id = $e['id']; 
    $a[$exerciseid][$id] = $e; 
} 

или короче:

while ($e = $db->fetch()) { 
    $a[$e['exerciseid']][$e['id']] = $e; 
} 

и если вы не хотите, чтобы некоторые клавиши, используйте unset() удалить их:

while ($e = $db->fetch()) { 
    $exerciseid = $e['exerciseid']; 
    $id = $e['id']; 
    unset($e['id']); 
    unset($e['exerciseid']); 
    unset($e['date']); 
    $a[$exerciseid][$id] = $e; 
} 
1
$a[$e['exerciseId']][$e['id']] = array_diff_key($e, array_flip(array('exerciseId', 'id', 'date'))); 

Если вы назначая тот же массив в другой массив, сделайте $a = $b.
Если вам нужны только некоторые клавиши выбора, используйте array_intersect_key.
Если вы хотите опустить определенные ключи, используйте array_diff_key.

+0

ваша отсутствующая «дата» в вашем массиве_flip – DevZer0

+1

Я проголосовал за ваш ответ, потому что он намного короче, даже если он менее читабельен. Кроме того, трюк 'array_diff_key' -' array_flip' является более сложным PHP-скриптом, на мой взгляд. Может быть, немного трудно понять, но очень изящно для пуриста. –

0
while($e = $db->fetch()) { 
    foreach(array('time','weight','distance','reps','intensity') as $k){ 
     $a[$e['exerciseid']][$e['id']][$k] = $e[$k]; 
    } 
} 
0

Попробуйте

function groupbyId(&$items,$group_by_key) 
{   
    $newkey=0; 
    $grouparr = array(); 
    foreach ($items as $key => $val) 
    { 
      $grouparr[$val[$group_by_key]][$newkey]=$val; 
      $newkey++;  
    } 
    return $grouparr; 
} 
$grouparr = groupbyId($items,"exerciseid"); 
print_r($grouparr); 
Смежные вопросы