5

ネストされた配列を解凍するスマートな方法を学びたいと思います。たとえば、次のような配列変数$rma_data['status']があります。

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

    )

CreatedタイムスタンプとstatusIdを、次のような条件に基づいて変数に格納したいと思います。「Open」ステータスが存在することがわかった場合、「New」と「Created」の代わりにOpenを使用します。NewとCreatedしかない場合は、代わりにNewを使用します。

それを行うための私の方法の現在のバージョン:

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

                                            case 2:

                                            case 3:
                }

何か案は?

4

4 に答える 4

2

小規模から中規模の場合、すでに持っているものは見栄えがします。

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

例えば:

$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
    }
}
于 2013-02-19T11:48:55.837 に答える
1

のこれらの3つの特定の値に本当に依存している場合statusName、それを実行するためのより簡単で読みやすい方法は、より簡単にテストできるステータスタイプのインデックス付き配列を作成することです。

例えば:

$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']
于 2013-02-19T12:00:08.587 に答える
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;
    }
}
于 2013-02-19T11:46:17.553 に答える
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';
 }

}

2番:

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";
}
于 2013-02-19T12:12:31.563 に答える