2017-04-26 81 views
1

我有一些脚本与foreach,见下文, 我的每个始终显示输出2 - 1 - 3 - 4 - 等从我的JSON对象,如何解决我的问题,?foreach迭代结构显示

<?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 - 等

这是其他输出: output iteration

+0

的期望是什么O/P – webpic

+0

向我们展示你的原生JSON结构。 – Script47

+0

你生JSON在2-1-3的posisi ......为了这就是为什么 –

回答

0

这是因为如果你的代码中的语句不能决定你输出的序列应该是什么。

您可以使用usort重新安排这样的你的$的数据,

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

'usort($数据,功能($一个,$ B){ \t \t \t返回$ A [ 'posisi'] - $ B [ 'posisi']; \t \t});'为PHP 5.3 – ikwijaya

0

你有你的排序数组,那么你可以得到数组排序列表。你可以使用kso​​rt()函数将重点

+0

使用kso​​rt,因为它是不是应该被排序的关键就没有真正解决这个问题。像Kris Roofe的回答中使用usort是更好的方法。 – Sondre

0

第一那是你的字符串错误的JSON格式整理您的阵列。 如果你的JSON格式是正确的,然后就去做usort被定义在此之后

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>"; 
}