【问题标题】:Loop through json array and group by key values循环遍历json数组并按键值分组
【发布时间】:2016-01-10 12:03:57
【问题描述】:

在 json_decode 之后我有以下数组 :::

$json = Array ( [name] => Array ( [0] => Peter [1] => David ) [dep] => Array ( [0] => accounts [1] => sales ) [date] => Array ( [0] => 10/27/2015 [1] => 09/25/2015 ) );

如何按键对值进行分组,以便在 PHP foreach 循环中获得以下内容? :::

<ul>
    <li>Peter, accounts, 10/27/2015</li>
    <li>David, sales, 09/25/2015</li>
</ul>

我尝试了一个类似的 foreach 循环(见下文),但没有得到想要的结果,我可以打印所有键和值,但我无法按键对值进行分组,例如。 [1] :::

foreach($json as $row){
    foreach($row as $key=>$val){
        echo $key . ': ' . $val . '<br>';
    }
}

任何帮助将不胜感激 :::

【问题讨论】:

    标签: php json foreach key


    【解决方案1】:

    您可以使用以下代码对列表进行排序:

    <?php
        $json = [
            "name" => ["Peter","David"],
            "dep" => ["accounts", "sales"],
            "date" => ["10/27/2015","09/25/2015"]
        ];
        $final = [];
        foreach($json as $section)
        {
            foreach($section as $key=>$info)
            {
                if(!isset($final[$key])) $final[$key] = "";
                $final[$key] .= $info . ", ";
            }
        }
    
        echo "<ul>";
        foreach($final as $row)
        {
            echo "<li>" . substr($row, 0, strlen($row) - 2) . "</li>"; // -2 to remove the extra ", "
        }
        echo "</ul>";
    ?>
    

    结果:

    <ul>
        <li>Peter, accounts, 10/27/2015</li>
        <li>David, sales, 09/25/2015</li>
    </ul>
    

    【讨论】:

    • THX GGG,它工作得很好:::我会根据我的最终用途调整它:::
    【解决方案2】:

    也许可以试试这样的:

    $arrayCount = count($json['name']);
    
    $output = '<ul>';
    
    for($i = 0; $i < $arrayCount; $i++) {
        $output .= '<li>';
        $output .= $json['name'][$i] . ', ';
        $output .= $json['dep'][$i] . ', ';
        $output .= $json['date'][$i];
        $output .= '</li>';
    }
    
    $output .= '</ul>';
    
    echo $output;
    

    你最好使用这样的数组格式:

    $json = 
    Array( 
          Array( 
            'name' => 'Peter',
            'dep' => 'accounts',
            'date' => '10/27/2015'
          ),
          Array( 
            'name' => 'David',
            'dep' => 'accounts',
            'date' => '09/25/2015'
          )
        );
    

    这是因为您可以像这样创建一个更易于理解的 foreach 循环:

    $output = '<ul>';
    
    foreach($json as $row) {
        $output .= '<li>';
        $output .= $row['name'] . ', ';
        $output .= $row['dep'] . ', ';
        $output .= $row['date'];
        $output .= '</li>';
    }
    
    $output .= '</ul>';
    
    echo $output;
    

    【讨论】:

    • 在我看来,这个答案比我的更具可读性并且代码更简洁,我建议 OP 将此标记为最佳答案。
    • 我收回这一点,您的代码有语法错误(在 for 循环中使用 i 而不是 $i 并使用 , 而不是 ;)并且您的 for 循环也计算$json 中的元素,即 3([name],[dep],[date]) 因此这段代码根本不起作用。
    • 感谢您指出这一点,我已经修复了错误。它现在可以按要求工作了。
    • 感谢所有建议,但是我无法按照上面的建议更改数组结构,这就是我难以提取关键相关数据的原因 :::
    • 如果您在我的回复中使用顶部代码 sn-p,它将按原样打印您的数组。
    猜你喜欢
    • 2013-02-12
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2021-12-17
    • 2017-05-21
    • 2015-07-22
    • 2013-08-16
    • 2011-06-11
    相关资源
    最近更新 更多