2013-02-19 8 views
5

Ich möchte eine intelligente Möglichkeit zum Entpacken verschachtelten Array lernen. Zum Beispiel habe ich eine Array-Variable $ rma_data ['status'], die wie folgt aussieht;PHP entpacken Array

[status] => Array 
    (
     [0] => Array 
      (
       [created] => 1233062304107 
       [statusId] => 5 
       [statusName] => Open 
      ) 

     [1] => Array 
      (
       [created] => 1233061910603 
       [statusId] => 2 
       [statusName] => New 
      ) 

     [2] => Array 
      (
       [created] => 1233061910603 
       [statusId] => 1 
       [statusName] => Created 
      ) 

    ) 

Ich möchte die Erstellt Zeitstempel und StatusID in einer Variablen speichern, basierend auf dem Zustand wie: Wenn wir es herausfinden, ist „Open“ Status vorhanden sind, werden wir zu öffnen statt „Neu“ und „Erstellt ". Wenn nur Neu und Erstellt vorhanden sind, verwenden wir stattdessen Neu.

Aktuelle Version meiner Art und Weise, das zu tun:

for($i=0; $i<count($rma_data['status']); $i++) 
       { 
        switch($rma_data['status'][$i]['statusId']) 
        { 
         case 5: 

              case 2: 

              case 3: 
       } 

Irgendwelche Ideen?

+0

sortieren das Array auf ihren Status basiert, nehmen die höchste sortiert. – deceze

Antwort

2

Für kleine bis mittelgroße, was Sie bereits eine gute aussieht.

Meine einzigen Vorschläge wäre es, zusätzliche Variablen zu verwenden, zum Beispiel die Anzahl und einige der kompakten Code zu entrollen, um effizienter und lesbarer zu sein.

Zum Beispiel:

$total=count($rma_data['status']); 
for($i=0; $i<$total; $i++){ 
    $x=$rma_data['status'][$i]; 
    if($x['statusName']=='Open'){ // Use your criteria 
     $t=$x['created']; 
     //...Do Work 
    } 
} 
+0

danke, ich werde es versuchen – QLiu

0

verstehe ich nicht ganz eine notwendige Bedingung, aber es kann so helfen wird:

$searched_status_id = null; 
$searched_timestamp = null; 
foreach ($rma_data['status'] as $id => $status) { 
    if ((!$searched_timestamp && !$searchуd_status_id) || 
     ($status['statusName'] == 'New' || $status['statusName'] == 'Open')) { 
     $searched_timestamp = $status['created']; 
     $searched_status_id = $status['statusId']; 
    } 
    if ($status['statusName'] == 'Open') { 
     break; 
    } 
} 
+0

Sorry, bearbeitet deine Antwort lieber als meine ...! – zaf

1

Wenn Sie sich auf diesen drei spezifischen Werten von statusName wirklich abhing, eine einfache und lesbare Weise zu gehen, um es ein indiziertes Array von Statustypen Sie zu erstellen wäre die kann einfacher testen.

Zum Beispiel:

$rma_statuses = array(); 
foreach ((array)$rma_data['status'] as $status) : 
    $rma_statuses[$status['statusName']] = array(
     'created'=>$status['created'], 
     'id'=>$status['statusId'] 
    ); 
endforeach; 

$rma_stauts = $rma_statuses['open'] ?: ($rma_statuses['new'] ?: $rma_statuses['created']); 

// Do something with $rma_stauts['created'] and $rma_stauts['id'] 
0
if(is_array($rma_data['status'])){ 
//assuming there are only three values inside it 
//case1 
$open = ($rma_data['status'][0]['statusName'] == 'Open' || 
      $rma_data['status'][1]['statusName'] == 'Open' || 
      $rma_data['status'][2]['statusName'] == 'Open'); 
//case2 
$new = (!$open && 
     ($rma_data['status'][0]['statusName'] == 'New' || 
      $rma_data['status'][1]['statusName'] == 'New' || 
      $rma_data['status'][2]['statusName'] == 'New')); 
if($open){ 
    echo 'open'; 
}elseif($new){ 
    echo 'New'; 
}else{ 
    echo 'None'; 
} 

} 

Zweitens:

foreach($rma_data['status'] as $key => $val){ 
$statusName = $val['statusName']; 
$newarray[$statusName] = $val; 
} 
echo '<pre>'; 
print_r($newarray); 

if(array_key_exists('Open', $newarray)){ 
$created = $newarray['Open']['created']; 
$statusId = $newarray['Open']['statusId']; 
echo 'Open'; 

} 
elseif(array_key_exists('New', $newarray)){ 
$created = $newarray['New']['created']; 
$statusId = $newarray['New']['statusId']; 
    echo 'New'; 
}else{ 
echo "None"; 
}