【问题标题】:Foreach overwrites previous records in multidimensional arrayForeach 覆盖多维数组中的先前记录
【发布时间】:2016-01-28 09:16:37
【问题描述】:

我有一个多维数组,我想以表格形式显示这个数组

+------+-----+--------+-------+-------+
| Name | red | yellow | green | white |
+------+-----+--------+-------+-------+
| abc  |   8 |      2 |     4 |     0 |
| xyz  |   2 |      8 |     0 |     0 |
+------+-----+--------+-------+-------+

以下是我的数组

[0] => array(
        'label'=> 'red',
        [value] => Array
        (
                [0] => array
                (
                        [count] => 47
                        [firstname] => Syst

                )
                [1] => array
                (
                        [count] => 2
                        [firstname] => xyz
                )

                [2] => array
                (
                        [count] => 8
                        [firstname] => abc
                )
)
[1] => array(
        'label'=> 'yellow',
        [value] => Array
        (
                [0] => array
                (
                        [count] => 4
                        [firstname] => dim
                )
                [1] => array
                (
                        [count] => 2
                        [firstname] => abc
                )
                [2] => array
                (
                        [count] => 8
                        [firstname] => xyz
                )
        )

等等 我已经厌倦了下面的代码,但我不知道代码有什么问题。

foreach($rows as $row)
{
    echo '<th>'.$row->label.'</th></tr>';
    $i = 1;
    $final = [];
    foreach($row->value as $v){
        $temp = [];
        $temp[$v->firstname.' '.$v->lastname] = [];
        $output = findKey($final, $v->firstname.' '.$v->lastname);
        if($output){
            $temp[$v->firstname.' '.$v->lastname]['count'] = $v->count ;
            $temp[$v->firstname.' '.$v->lastname][$row->label.'_'.$row->color] =  $v->count ;
        }
        array_push($final,$temp);
    }
}
print_r($rows); //die;

【问题讨论】:

  • 这一行是错误的echo '&lt;th&gt;'.$row-&gt;label.'&lt;/th&gt;&lt;/tr&gt;'; ~ 它会为循环中的每次迭代添加一个结束的tr 标签,并且会抛出任何不对齐的格式
  • 您提供的print_r 输出已被手动操作,不可能来自print_r。请确保提供您拥有的数组,否则解决方案将不是您所需要的。
  • 您使用-&gt; 表示法,但您的数据没有显示任何对象,只有数组。您能否提供您收到的错误消息?
  • 我已将对象转换为数组 $arr = array(); $arr = objToArray($rows, $arr); $finalArr = 数组(); foreach($arr as $newArr){ $i=1; foreach($newArr['value'] as $valueArr){ $temp = array(); $name = $valueArr['firstname'].' '.$valueArr['姓氏']; $temp[$name]['count_'.$i] = $valueArr['count'];回声$名称; print_r($finalArr); if(multiKeyExists($finalArr,$name)){ $temp[$name]['count_'.$i] = $valueArr['count']; } $i++; array_push($finalArr,$temp); } } 但它仍然不适合我
  • 什么不工作,你得到什么错误信息,什么输出是错误的?你可以说得更详细点吗?请在问题中添加此信息,因为在 cmets 中几乎无法读取。

标签: php arrays multidimensional-array foreach array-push


【解决方案1】:

您提供的print_r 输出不一致 - 它已被操纵以添加标签键。 print_r 会将它们输出为[label],而不是"label",而且print_r 不会在同一行的末尾输出逗号。

因此,由于您没有提供正确的数组,因此存在解决方案不起作用的风险,我在此提供基于以下数组的解决方案:

$finalArr = 
array(
    array(
        'label' => 'red',
        'value' => Array (
                array ("count" => 47, "firstname" => 'Syst'),
                array ("count" => 2, "firstname" => 'xyz'),
                array ("count" => 8, "firstname" => 'abc')
        )
    ),
    array(
        'label' => 'yellow',
        "value" => Array (
                array ("count" => 4, "firstname" => 'dim'),
                array ("count" => 2, "firstname" => 'abc'),
                array ("count" => 8, "firstname" => 'xyz')
        )
    )
);

那么解决方案可能是这样的:

// collect unique list of "firstname" values
$rowHeaders = array();
foreach($finalArr as $column) {
    $rowHeaders = array_merge($rowHeaders, array_column($column["value"], "firstname"));
}
$rowHeaders = array_unique($rowHeaders);
usort($rowHeaders, 'strcasecmp');

// get column headers
$colHeaders = array_column($finalArr, "label");

// create matrix: first column
$matrix = array(array_merge(array("Name"), $colHeaders));
foreach($rowHeaders as $firstname) {
    $matrix[] = array($firstname);
}
// ... and colour columns:
foreach($finalArr as $colIndex => $column) {
    $names = array_column($column["value"], "firstname");
    foreach ($rowHeaders as $rowIndex => $name) {
        $matrix[$rowIndex+1][] = in_array($name, $names) ? $column["value"][array_search($name, $names)]["count"] : 0;
    }
}

// convert matrix into HTML table
$html = "";
$td = "th";
foreach ($matrix as $row) {
    $html .= "<tr><$td>" . implode("</$td><$td>", $row) . "</$td></tr>\n"; 
    $td = "td";
}
$html = "<table border=1>\n$html</table>";

// output html:
echo $html;

输出是:

<table border=1>
<tr><th>Name</th><th>red</th><th>yellow</th></tr>
<tr><td>abc</td><td>8</td><td>2</td></tr>
<tr><td>dim</td><td>0</td><td>4</td></tr>
<tr><td>Syst</td><td>47</td><td>0</td></tr>
<tr><td>xyz</td><td>2</td><td>8</td></tr>
</table>

在浏览器中呈现为:

【讨论】:

  • 感谢您的解决方案 :) 但我需要红色、黄色作为列名和名字,例如 Name red yellow green white abc 8 2 4 0 dim 2 8 0 0 sys 1 0 8 45 xyz 7 2 0 5
  • 好的,调整答案以将行/列切换到我之前呈现的内容。
【解决方案2】:

只需在第一个循环之外初始化 $final 数组。如下图..

    $final = [];

    foreach($rows as $row)
    {
        echo '<th>'.$row->label.'</th></tr>';
        $i = 1;    
        foreach($row->value as $v){
            $temp = [];
            $temp[$v->firstname.' '.$v->lastname] = [];
            $output = findKey($final, $v->firstname.' '.$v->lastname);
            if($output){
                $temp[$v->firstname.' '.$v->lastname]['count'] = $v->count ;
                $temp[$v->firstname.' '.$v->lastname][$row->label.'_'.$row->color] =  $v->count ;
            }
            array_push($final,$temp);
        }
    }
    print_r($rows); //die;

【讨论】:

  • 所以现在 $final 数组还在覆盖以前的值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多