2017-04-26 14 views
1

Ich habe ein Skript mit foreach, siehe unten, meine für jeden zeigen immer Ausgabe 2 - 1 - 3 - 4 - etc von meinem Json-Objekt, wie mein Problem zu lösen ,?Foreach Iteration Struktur zeigen

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

Ausgang immer:

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

Warum: 2 - 1 - 3 - etc, nicht mehr als 1 - 2 - 3 - etc

dieser andere Ausgang ist: output iteration

+0

was erwartet o/p – webpic

+0

Zeigen Sie uns Ihre ursprüngliche rohe JSON-Struktur. – Script47

+0

Dein roher JSON hat die Posisi in 2-1-3 ... Reihenfolge deshalb –

Antwort

0

Das liegt daran, dass Anweisungen in Ihrem Code nicht entscheiden können, in welcher Reihenfolge Sie ausgeben sollen.

Sie können usort verwenden, um die Ihre $ Daten wie folgt neu zu ordnen,

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

'usort ($ data, Funktion (a $, $ b) { \t \t \t return $ a [ 'posisi'] - $ b [ 'posisi']; \t \t});' für PHP 5.3 – ikwijaya

0

Sie haben Ihr Array sortieren, dann können Sie die sortierten Array-Liste erhalten. Sie können die Funktion ksort() verwenden, die Ihr Array nach Schlüssel

+0

Die Verwendung von ksort würde dieses Problem nicht wirklich lösen, da es nicht der Schlüssel ist, nach dem es sortiert werden sollte. Mit usort wie in der Antwort von Kris Roofee ist es besser. – Sondre

0

zuerst sortiert, das ist ein falsches json Format auf Ihrer Schnur. und wenn Ihr JSON-Format rechts, dann gerade dieses

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

output renderlayout3x3

meine Ausgabe Fall tun war nach usort definiert ist.

Verwandte Themen