2013-02-19 11 views
5

Chciałbym nauczyć się inteligentnego sposobu rozpakowania tablicy zagnieżdżonej. Na przykład mam zmienną tablicową $ rma_data ['status'], która wygląda jak poniżej;PHP unpack 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 
      ) 

    ) 

Chciałbym zapisać utworzonych znaczników czasu i StatusId w produkt zmiennych w oparciu o stan jak: jeśli znajdziemy tam jest „otwarty” istnieje stan, będziemy używać otwartego zamiast „nowy” i „Utworzony ". Jeśli są tylko nowe i utworzone, zamiast tego użyjemy opcji Nowy.

Aktualna wersja moim sposobem na to:

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

              case 2: 

              case 3: 
       } 

Jakieś pomysły?

+0

Sortowanie tablicy na podstawie ich statusu, wziąć najwyższy klasyfikowane jeden. – deceze

Odpowiedz

2

dla małych i średnich skalę, co masz już wygląda dobrze.

Moje jedyne sugestie to użycie dodatkowych zmiennych, na przykład liczby i rozwinięcie części zwartego kodu, aby była bardziej wydajna i czytelna.

Na przykład:

$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

dzięki, spróbuję – QLiu

0

ja nie bardzo rozumiem warunek konieczny, ale może być jak to pomoże:

$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

Przepraszam, zredagowałem twoją odpowiedź zamiast mojej ...! – zaf

1

Jeśli jesteś naprawdę zależało na tych trzech konkretnych wartościach statusName, bardziej prosty i czytelny sposób, aby go o to byłoby stworzyć indeksowany wachlarz typów stanu, który cię można łatwiej testować.

Na przykład:

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

} 

drugie:

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