2016-11-29 11 views
-1

私は配列を持っています。いくつかの条件を実行した後、結果の配列は以下のようになります。複数値の多次元配列で検索する

//filtered aray 
Array 
(
    [2] => Array 
     (
      [OriginEventId] => 0152c945-e15b-48f9-8a0e-e4b9eace4731 
      [Description] => Pension Reversion 
      [transaction_date] => 2014-10-30T00:00:00 
      [transaction_amount] => -1129794.96 
      [member_id] => 1 
      [type] => InternalTransfers 
      [transaction_type] => Accumulation 
     ) 

    [13] => Array 
     (
      [OriginEventId] => 0152c945-e15b-48f9-8a0e-e4b9eace4731 
      [Description] => Pension Reversion 
      [transaction_date] => 2014-10-30T00:00:00 
      [transaction_amount] => 1129794.96 
      [member_id] => 1 
      [type] => PensionsRolledBack 
      [transaction_type] => Accumulation 
     ) 

    [23] => Array 
     (
      [OriginEventId] => 0152c945-e15b-48f9-8a0e-e4b9eace4731 
      [Description] => Pension Reversion 
      [transaction_date] => 2014-10-30T00:00:00 
      [transaction_amount] => -1129794.96 
      [member_id] => 1 
      [type] => PensionsRolledBack 
      [transaction_type] => Pension 
     ) 

    [24] => Array 
     (
      [OriginEventId] => 0152c945-e15b-48f9-8a0e-e4b9eace4731 
      [Description] => Pension Reversion 
      [transaction_date] => 2014-10-30T00:00:00 
      [transaction_amount] => 1129794.96 
      [member_id] => 2 
      [type] => InternalTransfers 
      [transaction_type] => Accumulation 
     ) 

    [36] => Array 
     (
      [OriginEventId] => 0152c945-e15b-48f9-8a0e-e4b9eace4731 
      [Description] => Pension Reversion 
      [transaction_date] => 2014-10-30T00:00:00 
      [transaction_amount] => -1129794.96 
      [member_id] => 2 
      [type] => PensionCommencement 
      [transaction_type] => Accumulation 
     ) 

    [56] => Array 
     (
      [OriginEventId] => 0152c945-e15b-48f9-8a0e-e4b9eace4731 
      [Description] => Pension Reversion 
      [transaction_date] => 2014-10-30T00:00:00 
      [transaction_amount] => 1129794.96 
      [member_id] => 2 
      [type] => PensionCommencement 
      [transaction_type] => Pension 
     ) 

) 

私の仕事は、オフセット取引をすべて削除することです。たとえば、あるメンバーの累積に肯定と否定が含まれている場合は、それを削除します。

この結果の配列を使用すると、member_id,transaction_typeおよびtransaction_amountに基づいてフィルタリングする必要があります。 (正か負か)。 member_idtransaction_typeが同じ場合、オフセット取引を削除する必要があります。

除去した後、得られた配列は、次のようになります。私はMEMBER_ID、TRANSACTION_TYPEとTRANSACTION_AMOUNTに基づいてフィルタリングしている

Array 
(
    [23] => Array 
     (
      [OriginEventId] => 0152c945-e15b-48f9-8a0e-e4b9eace4731 
      [Description] => Pension Reversion 
      [transaction_date] => 2014-10-30T00:00:00 
      [transaction_amount] => -1129794.96 
      [member_id] => 1 
      [type] => PensionsRolledBack 
      [transaction_type] => Pension 
     ) 

    [56] => Array 
     (
      [OriginEventId] => 0152c945-e15b-48f9-8a0e-e4b9eace4731 
      [Description] => Pension Reversion 
      [transaction_date] => 2014-10-30T00:00:00 
      [transaction_amount] => 1129794.96 
      [member_id] => 2 
      [type] => PensionCommencement 
      [transaction_type] => Pension 
    ) 
) 

MY CODE

$total = $array; 
    array_walk($array, function($value) use(&$total){ 
     $result = $this->multiSearch($total, array('transaction_type' =>$value['transaction_type'], 'smsf_actuarial_form_member_id' => $value['smsf_actuarial_form_member_id'], 'transaction_amount' => $value['transaction_amount'])); 
     pr($result);exit; 
    }); 
public function multiSearch(array $array, array $pairs) { 
    $found = array(); 
    foreach ($array as $aKey => $aVal) { 
     $coincidences = 0; 
     foreach ($pairs as $pKey => $pVal) { 
      if (array_key_exists($pKey, $aVal)) { 
       if(is_double($aVal[$pKey]) && is_double($pVal) && abs($aVal[$pKey]) == abs($pVal)){ 
        $coincidences++; 
       } else if($aVal[$pKey] == $pVal){       
        $coincidences++; 
       } 
      } 
     } 
     if ($coincidences == count($pairs)) { 
      $found[$aKey] = $aVal; 
     } 
    } 

    return $found; 
} 

[2] => Array 
     (
      [OriginEventId] => 0152c945-e15b-48f9-8a0e-e4b9eace4731 
      [Description] => Pension Reversion 
      [transaction_date] => 2014-10-30T00:00:00 
      [transaction_amount] => -1129794.96 
      [smsf_actuarial_form_member_id] => 1 
      [type] => InternalTransfers 
      [transaction_type] => Accumulation 
     ) 

    [13] => Array 
     (
      [OriginEventId] => 0152c945-e15b-48f9-8a0e-e4b9eace4731 
      [Description] => Pension Reversion 
      [transaction_date] => 2014-10-30T00:00:00 
      [transaction_amount] => 1129794.96 
      [smsf_actuarial_form_member_id] => 1 
      [type] => PensionsRolledBack 
      [transaction_type] => Accumulation 
     ) 

同じメンバーID、取引タイプ、取引金額が肯定と否定の両方である場合は、それを削除する必要があります。

フロー

  1. フィルタMEMBER_ID、TRANSACTION_TYPE及びTRANSACTION_AMOUNT(正と負の両方)の配列。

  2. 結果の配列に肯定と否定の両方がある場合は、両方の配列をフィルタ処理された配列とリンク解除します。

条件は動的に機能します。

PLEASE VIEW CODE HERE

+0

unset機能を使用し、配列内の要素を削除するには(私は何かが足りないのですか?)、単にループするforeachを使用して値を通って、 ifを使用してください –

+0

[array_filter(function($ input){...}、$ array); '](http://php.net/manual/en/function.array-filter.php )? – Bobot

答えて

2

私は問題を見ることができない

foreach ($array as $key => $value) { 
    if (isset($array[$key])) { 
     foreach ($array as $k => $v) { 
      if (
       $value['member_id'] === $v['member_id'] && 
       $value['transaction_type'] === $v['transaction_type'] && 
       $value['transaction_amount'] === -$v['transaction_amount'] 
      ) { 
       unset($array[$key], $array[$k]); 
       break; 
      } 
     } 
    } 
} 
+0

更新された質問 –

+0

私は2つの結果の配列を持っていた場合2陽性と2陰性それは動作ですか? –

関連する問題