2013-02-19 9 views
5

ネストされた配列を解凍するスマートな方法を学びたいと思います。たとえば、配列変数$ rma_data ['status']は以下のようになります。PHPアンパック配列

[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 
      ) 

    ) 

私のような条件に基づいて変数に作成されたタイムスタンプとstatusIdを保存したいと思います:私たちは外に発見した場合「オープン」ステータスがあります存在し、我々は代わりに「新」のオープンを使用し、「作成されました" NewとCreatedだけがある場合は、代わりにNewを使用します。それを行うための私の方法の

現在のバージョン:

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

              case 2: 

              case 3: 
       } 

任意のアイデア?私は非常に必要な条件を理解していないが、それはこのようにすることができ

+0

ソート自分のステータスに基づいて、アレイは、最高のものをソート取ります。 – deceze

答えて

2

を、あなたが既に持っていることはよさそうです。

私の唯一の提案は、カウントなどの追加の変数を使用し、コンパクトコードの一部を展開してより効率的で読みやすいようにすることです。例えば

:あなたは本当にstatusNameのこれらの3つの特定の値に依存している場合

$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

ありがとう、私は試してみる – QLiu

0

が役立ちます:中規模小規模の場合

$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

申し訳ありません、あなたの答えは私のものよりも編集しました...! – zaf

1

、それについて移動するより簡単で読みやすい方法はこれを使用しステータスタイプのインデックス付き配列を作成することですより簡単にテストできます。例えば

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

} 

第二:

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