【问题标题】:Foreach iteration structure showForeach 迭代结构展示
【发布时间】:2017-09-23 14:45:38
【问题描述】:

我有一些带有foreach 的脚本,见下文, 我的 for each 总是从我的 json 对象显示输出 2 - 1 - 3 - 4 - 等,如何解决我的问题?

<?php public function renderLayout3x3($data=array()){
    $output = "<ul>";

    foreach ($data as $key => $value) {
        if($value['posisi'] == '1'){
            $output .= "<li><ul>
                                <li>POS:".$value['posisi']."</li>
                                <li>HOSTNAME:".$value['hostname']."</li>
                        </ul></li>";
        }
        if($value['posisi'] == '2'){
            $output .= "<li><ul>
                                <li>POS:".$value['posisi']."</li>
                                <li>HOSTNAME:".$value['hostname']."</li>
                        </ul></li>";
        }
        if($value['posisi'] == '3'){
            $output .= "<li><ul>
                                <li>POS:".$value['posisi']."</li>
                                <li>HOSTNAME:".$value['hostname']."</li>
                        </ul></li>";
        }

        //for debug..
        print json_encode($value['posisi']);
        /*
        Output : "2","1","3","4","5","6","7","8","9"
        Why : 2 - 1 - 3 - etc, not 1 - 2 - 3 - etc 
        */
    }
    $output .= "</ul>";
    return $output;
}

$json_data = '{"ch":"79",
                "ipaddr":"172.16.11.100",
                "hostname":"TMC-MALL01",
                "posisi":"2",
                "monitorid":"17",
                "view_dimension":"2*2",
                "input_ipaddr":""
            }{
                "ch":"78",
                "ipaddr":"172.16.11.99",
                "hostname":"TMC-JSB01",
                "posisi":"1",
                "monitorid":"17",
                "view_dimension":"2*2",
                "input_ipaddr":""
            }{
                "ch":"80",
                "ipaddr":"172.16.11.101",
                "hostname":"TMC-MALL02",
                "posisi":"3",
                "monitorid":"17",
                "view_dimension":"2*2",
                "input_ipaddr":""
            }{
                "ch":"92",
                "ipaddr":"172.16.11.106",
                "hostname":"TMC-PALMA01",
                "posisi":"4",
                "monitorid":"17",
                "view_dimension":"2*2",
                "input_ipaddr":""
            }{
                "ch":"93",
                "ipaddr":"172.16.11.107",
                "hostname":"TMC-PALMA02",
                "posisi":"5",
                "monitorid":"17",
                "view_dimension":"2*2",
                "input_ipaddr":""
            }{
                "ch":"112",
                "ipaddr":"172.16.11.129",
                "hostname":"TMC-R.PRM01",
                "posisi":"6",
                "monitorid":"17",
                "view_dimension":"2*2",
                "input_ipaddr":""
            }{
                "ch":"113",
                "ipaddr":"172.16.11.130",
                "hostname":"TMC-R.PRM03",
                "posisi":"8",
                "monitorid":"17",
                "view_dimension":"2*2",
                "input_ipaddr":""
            }{
                "ch":"114",
                "ipaddr":"172.16.11.131",
                "hostname":"TMC-R.PRM02",
                "posisi":"7",
                "monitorid":"17",
                "view_dimension":"2*2",
                "input_ipaddr":""
            }{
                "ch":"115",
                "ipaddr":"172.16.11.132",
                "hostname":"TMC-R.PRM04",
                "posisi":"9",
                "monitorid":"17",
                "view_dimension":"2*2",
                "input_ipaddr":""
            }';

$render = renderLayout3x3($json_data);
print $render; ?>

总是输出:

Output : "2","1","3","4","5","6","7","8","9"

为什么:2 - 1 - 3 - 等等,而不是 1 - 2 - 3 - 等等

这是其他输出:

【问题讨论】:

  • 预期 o/p 是什么
  • 向我们展示您的原始原始 JSON 结构。
  • 您的原始 json 在 2-1-3 中具有 posisi...order 这就是原因
  • 您按该顺序获取它们,因为这是您的 json 对它们的顺序。循环它不会神奇地为您排序,您必须自己做。据我所知,那些 if 语句的作用完全相同,这使得它们都是多余的。你可以像现在一样把它切成一个块。
  • @Script47 我使用 'posisi' 进行索引

标签: php json if-statement foreach


【解决方案1】:

这是因为你的代码中的 if 语句无法决定你输出的顺序。

您可以像这样使用 usort 重新排列您的 $data,

usort(&$data, function($a, $b){return $a['posisi'] <=> $b['posisi'];});

【讨论】:

  • usort($data, function($a,$b){ return $a['posisi'] - $b['posisi']; }); 用于 php 5.3
【解决方案2】:

您必须对数组进行排序,然后才能获得排序后的数组列表。你可以使用 ksort() 函数来对你的数组进行排序

【讨论】:

  • 使用 ksort 并不能真正解决这个问题,因为它不是排序的关键。在 Kris Roofe 的回答中使用 usort 是一种更好的方法。
【解决方案3】:

首先那是您的字符串上的错误 json 格式。 如果你的 json 格式是正确的,那么就这样做

public function renderLayout3x3($data=array()){
    $data = json_decode($data); // decode json format to array

    // set posisi as index
    foreach ($data as $key => $value) 
    {
        $data[intval($value['posisi'])] = $value;
    }
    // sort index
    ksort($data);
    // get array values to data
    $data = array_values($data);

    $output = "";

    foreach ($data as $key => $value) {
        $output .= '<li><ul>
                        <li>POS:'.$value["posisi"].'</li>
                        <li>HOSTNAME:'.$value["hostname"].'</li>
                    </ul></li>';
    }
    return "<ul>$output</ul>";
}

【讨论】:

    【解决方案4】:

    我在定义了 usort 之后的输出情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      相关资源
      最近更新 更多