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

标签 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并将其变成网格/表格。

(错误...抱歉,我没有使用与另一个问题完全相同的示例集)

我在想出一个好的、有效的方法来做这件事时遇到了麻烦。


header 数组应该只是字符串“x”,后跟“y”的所有不同值。为了保持一致性,我们可以按字母顺序对它们进行排序。

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

最佳答案

不确定您是否认为这很好,但它应该是有效的。此外,您可以删除 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 是关键位所在的位置..其余的是规范化你的结果数组。

关于php - 如何将此多维数组转换为带有行标题和列标题的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8674681/

相关文章:

java - 在Java中的方法中返回两个数组

java - 查看 Java 数组的一部分

algorithm - 大 O 符号是否适用于 while(true) 循环?

javascript - 删除连续的重复字符

php - session 变量设置但返回空白

PHP - 如何从时间字符串中获取年、月、日

php - mysql 的 jQuery 模式用户删除选项

C++ 建议如何打破 while 循环

php - 如何使用 PHP 在 Azure 网站上使用 url 重写

c++ - 如何使用 vector 字符串标记构建表达式树?