2011-12-29 2 views
0

Как я могу преобразовать массив какКак преобразовать этот многомерный массив в массив с заголовками строк и столбцов?

array(
    0 => array(
     'x' => 'x1', 
     'y' => 'y1', 
     'count' => 2, 
    ), 
    1 => array(
     'x' => 'x3', 
     'y' => 'y1', 
     'count' => 3, 
    ), 
    2 => array(
     'x' => 'x3', 
     'y' => 'y2', 
     'count' => 4, 
    ), 
    3 => array(
     'x' => 'x1', 
     'y' => 'y2', 
     'count' => 6, 
    ), 
    4 => array(
     'x' => 'x2', 
     'y' => 'y3', 
     'count' => 7, 
    ), 
    5 => array(
     'x' => 'x2', 
     'y' => 'y2', 
     'count' => 1, 
    ), 
) 

(который является результатом запроса SQL)

в массив заголовка:

array('x','y1','y2','y3') 

и значение массива:

array(
    0 => array('x1',2,6,null), 
    1 => array('x2',null,1,7), 
    2 => array('x3',3,4,null), 
) 

Я пытаюсь взять result set from a query и повернуть его в таблицу/таблицу.

(эээ ... жаль, что я не использовал тот же самый пример, как установить с другой вопрос)

У меня возникли проблемы с придумывают хороший, эффективный способ сделать это.


Массив заголовка должен быть просто строкой «x», за которой следует все отдельные значения для «y». Для согласованности мы можем сортировать их по алфавиту.

Последний массив должен иметь 1 строку для каждого отдельного значения 'x' (который составляет индекс 0), а следующие индексы берутся из соответствующего 'count' для соответствующих значений x/y из первого массива (значение 'y' задается одним и тем же индексом в массиве 'header'). Отсутствующие значения могут быть null или 0.

+1

Можете ли вы объяснить, как построены два массива? –

+0

@AurelioDeRosa: Первый результат SQL-запроса (как намекнул из ссылки) ... второй, я думаю, я могу лучше объяснить в вопросе. – mpen

+0

Откуда берется значение «null»? Это не часть исходного массива, или я что-то упускаю? – hakre

ответ

1

Не уверен, что вы считаете это приятным, но оно должно быть эффективным. Кроме того, вы можете удалить ksort с для еще более ЭФФЕКТИВНОСТИ, если вы только планируете for по данным ... если вы хотите foreach вы должны будете держать их.

$header = array('x'); 
$body = array(); 
$row_len = 0; 

foreach ($input as $cell) { 
    $x = (int) substr($cell['x'], 1); 
    $y = (int) substr($cell['y'], 1); 
    $row_len = max($row_len, $y); // use for null-padding rows later 

    $header[$y] = $cell['y']; 

    // Populate body 
    $row =& $body[$x - 1]; 
    $row[0] = $cell['x']; 
    $row[$y] = $cell['count']; 
} 

// Fill missing nulls 
foreach ($body as &$row) { 
    for ($i = 1; $i <= $row_len; $i++) { 
     if (!isset($row[$i])) { 
      $row[$i] = null; 
     } 
    } 

    // Sort rows by key (since we've treated this as assoc-array) 
    ksort($row); 
} 

// Once again, assoc arrays, you'll need to ksort 
ksort($header); 
ksort($body); 

Первый Еогеасп где критический бит - это ... остальное - нормализовать полученный результирующий массив.

Смежные вопросы