Как я могу преобразовать этот многомерный массив в массив с заголовками строк и столбцов? - PullRequest
0 голосов
/ 30 декабря 2011

Как я могу преобразовать массив типа

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

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

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

У меня проблемы с подходящим и эффективным способом сделать это.


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

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

1 Ответ

1 голос
/ 30 декабря 2011

Не уверен, считаете ли вы это хорошим, но оно должно быть эффективным.Кроме того, вы можете удалить ksort s для еще большей эффективности, если вы планируете только 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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...