代码之家  ›  专栏  ›  技术社区  ›  significance

多维数组中的交叉引用表php?

  •  1
  • significance  · 技术社区  · 14 年前

    如何将多维数组转换为:

    $fruits['apples']['blue'] = 24;
    $fruits['bananas']['blue'] = 12;
    $fruits['apple']['red'] = 34;
    $fruits['gooseberries']['orange'] = 4;
    $fruits['oranges']['red'] = 12;
    

    在交叉引用的表中,如:

    alt text http://1updesign.org/uploads/p24.png

    2 回复  |  直到 7 年前
        1
  •  3
  •   Mo.    14 年前
    $cols = array('blue', 'red', 'orange');
    echo '<table>';
    echo '<thead><tr><td></td><th scope="col">' . implode('</th><th scope="col">', $cols) . '</th></tr></thead>';
    echo '<tbody>';
    foreach($fruits as $label => $row)
    {
        echo '<tr>';
        echo '<th scope="row">' . $label . '</th>';
        foreach($cols as $k)
        {
          echo '<td>' . (isset($row[$k]) ? $row[$k] : 0) . '</td>';
        }
        echo '</tr>';
    }
    echo '</tbody>';
    echo '</table>';
    

    你需要一些HTML转义之类的,但这就是要点。

        2
  •  0
  •   Felix Kling    14 年前

    你的阵列设计不好。怎么会知道呢 apples apple . 数组的构造方式应为:

    $fruits['apples']['blue'] = 24;
    $fruits['apples']['read'] = 24;
    $fruits['bananas']['blue'] = 12;
    $fruits['gooseberries']['orange'] = 4;
    $fruits['oranges']['red'] = 12;
    

    那么迭代就很容易了。数组的第一级是行。所以:

    <?php
    $column_head = array();
    foreach($fruits as $key => $value) {
       $column_head = array_merge($column_head, array_keys($value));
    }
    
    $column_head = array_unique($column_head);
    print_r($column_head);
    
    ?>
    <table>
        <tr>
            <th></th>
            <?php foreach($column_head as $head): ?>
                <th><?php echo $head; ?></th>
            <?php endforeach; ?>
        </tr>
        <?php foreach($fruits as $fruit => $amount): ?>
        <tr>
            <td><?php echo $fruit ?></td>
            <?php foreach($column_head as $head): ?>
                <td><?php echo isset($amount[$head]) ? $amount[$head] : 0 ?></td>
            <?php endforeach; ?>
        </tr>
        <?php endforeach; ?>
    
    </table>
    

    这将生成要动态使用的列,但可以对其进行硬编码,这可能更容易。因为代码使用了很多循环,所以可能没有那么有效…