如何将此多维数组转换为具有行和列标题的数组?

时间:2011-12-29 23:25:43

标签: php arrays algorithm multidimensional-array transform

如何转换像

这样的数组
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”的所有不同值。为了保持一致性,我们可以按字母顺序对它们进行排序。

对于'x'的每个不同值(构成索引0),最后一个数组应该有1行,并且对于来自第一个数组的相应x / y值,从相应的'count'获取以下索引( 'y'值由'header'数组中的相同索引给出。遗漏的值可以是null0

1 个答案:

答案 0 :(得分: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);

第一个foreach是关键位的位置..其余的是标准化你得到的数组。