2013-02-19 16 views
5

Mi piacerebbe imparare un modo intelligente per decomprimere array nidificati. Per esempio, ho una variabile di array $ rma_data ['status'] che appare come sotto;PHP decomprimere 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 
      ) 

    ) 

vorrei memorizzare i timestamp creato e StatusId in una variabili in base alla condizione come: se troviamo là fuori è "Open" status esiste, useremo aperto invece di "Nuovo" e "Creato ". Se c'è solo Nuovo e Creato, useremo invece Nuovo.

versione attuale del mio modo per farlo:

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

              case 2: 

              case 3: 
       } 

Tutte le idee?

+0

ordinare l'array in base al loro status, prendere il più alto ordinato uno. – deceze

risposta

2

Per le piccole e medie dimensioni, quello che hai già sembra buono.

I miei soli suggerimenti sarebbero di utilizzare variabili aggiuntive, ad esempio il conteggio e di srotolare parte del codice compatto per essere più efficiente e leggibile.

Ad esempio:

$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

grazie, farò un tentativo – QLiu

0

Io non capisco una condizione necessaria ma può essere come questo aiuterà:

$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

Siamo spiacenti, ho modificato la tua risposta piuttosto che la mia ...! – zaf

1

Se sei veramente dipendeva questi tre valori specifici di statusName, un modo più semplice e leggibile per andare a questo proposito sarebbe quello di creare un array indicizzato di tipi di stato, che si può testare più facilmente.

Ad esempio:

$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'; 
} 

} 

Secondo:

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