2016-10-21 10 views
0

配列から内部配列を削除する必要があります。実際には、配列はJSONのデコードによって得られ、n levelsまで行くことができます。動的なキーに基づいて親の配列から内部配列を削除する必要があります。以下はphp配列の答えを参照しようとしたコードです。PHPで内部配列を削除

$quotationHistory = json_decode($quotationCollection->getHistory(), true); 
$quotationId = 5; 
foreach ($quotationHistory as $sales_id => $history) { 
    foreach($history as $quotationIdValue => $values) { 
     if ($quotationId == $quotationIdValue) { 
      unset ($history[$quotationIdValue]); 
     } 
    } 
} 

サンプル:

Array 
(
    [1] => Array 
     (
      [5] => Array 
       (
        [0] => Array 
         (
          [0] => 3 
          [1] => 8490.0000 
          [2] => 21-10-2016 11:43:18am 
          [3] => 24-11-2016 11:43:18am 
          [4] => 199 
          [5] => rtg 
         ) 

        [1] => Array 
         (
          [0] => 12 
          [1] => 8490.0000 
          [2] => 21-10-2016 11:43:40am 
          [3] => 24-11-2016 11:43:18am 
          [4] => 199 
          [5] => rtg 
         ) 

        [2] => Array 
         (
          [0] => 45 
          [1] => 8490.0000 
          [2] => 21-10-2016 11:43:54am 
          [3] => 24-11-2016 11:43:18am 
          [4] => 199 
          [5] => rtg 
         ) 

        [3] => Array 
         (
          [0] => 11 
          [1] => 8490.0000 
          [2] => 21-10-2016 11:44:04am 
          [3] => 24-11-2016 11:43:18am 
          [4] => 199 
          [5] => rtg 
         ) 

        [4] => Array 
         (
          [0] => 54 
          [1] => 8490.0000 
          [2] => 21-10-2016 11:44:16am 
          [3] => 24-11-2016 11:43:18am 
          [4] => 199 
          [5] => rtg 
         ) 

       ) 

     ) 

) 

は今、私はあなたがより良い元の配列に設定解除を行いたいキー= 5

+0

は、あなたが 'if'状態で渡されましたか?あなたの '$ quotationId'変数は正しく初期化されていますか?あなたの '$ quotationId'とあなたの配列のダンプを行います。 'if'条件でトレースを追加します。 –

+0

追加した「サンプル」を正しくフォーマットしてください。読めません。 –

答えて

1

を有する第2レベルのデータを削除する:

$quotationHistory = json_decode($quotationCollection->getHistory(), true);    
foreach($quotationHistory as $sales_id => $history) { 
    foreach($history as $quotationIdValue => $values) { 
     if($quotationId == $quotationIdValue){ 
      unset($quotationHistory[$sales_id][$quotationIdValue]); 
     } 
    } 
} 

その理由は、内部配列がコピーとして渡されるためです。しかし、あなたはまた、参照することにより逢引を指定することができます。

直接&でループに先行の$値内配列の要素を変更することができるようにするために。この場合、値は参照(official Php doc)によって割り当てられます。

$quotationHistory = json_decode($quotationCollection->getHistory(), true);    
foreach($quotationHistory as $sales_id => &$history) { 
    foreach($history as $quotationIdValue => &$values) { 
     if($quotationId == $quotationIdValue){ 
      unset($$history[$quotationIdValue]); 
     } 
    } 
} 
+0

アイテムが削除されていません。 –

+0

あなたは 'if'条件に合格しましたか?あなたの '$ quotationId'変数は正しく初期化されていますか?あなたの '$ quotationId'とあなたの配列のダンプを行います。 'if'条件でトレースを追加します。 –

+0

質問のサンプル配列を追加しました –

0

リターンは、アレイの任意のレベルダウン(おそらくそれはあなたがn levelsによって何を意味するかだ)ことができるので、あなたはおそらく、再帰イテレータをお勧めします。 1つのメモでは、同じ値のキーを削除するので、5のキーはすべて削除されます。あなたが値で検索する必要がある場合は

$arr = array(
    'one'=>array(
     'one'=>'and a half', 
     'two'=>array(
      'three'=>'three and a half' 
     ) 
    ) 
); 

function recurse($array,$remove=false) 
    { 
     foreach($array as $key => $value) { 
      if($key != $remove){ 
       if(is_array($value)) { 
        $new[$key] = recurse($value,$remove); 
       } 
       else 
        $new[$key] = $value; 
      } 
     } 

     return $new; 
    } 

# Run the iterator to remove the key named "three" 
print_r(recurse($arr,'three')); 

、これは動作するはずです::

Array 
(
    [one] => Array 
     (
      [one] => and a half 
      [two] => 
     ) 

) 

function recurseValue($array,$remove=false) 
    { 
     foreach($array as $key => $value) { 
      if(is_array($value)) { 
       $new[$key] = recurseValue($value,$remove); 
      } 
      else { 
       if($value != $remove){ 
        $new[$key] = $value; 
       } 
      } 
     } 

     return $new; 
    } 
# Run the iterator to remove the key with the value named "Three and a half" 
print_r(recurseValue($arr,'three and a half')); 

があなたに与えるあなたは値rtgに基づいてキーを削除するために再帰する方が良いだろう

この最後のオプションは、配列を1レベルに正規化して、通常通りループできるようにします。

function recurseArray($array,&$new,$bkey = false) 
    { 
     foreach($array as $key => $value) { 
      if(is_array($value)) { 
       recurseArray($value,$new,$key); 
      } 
      else { 
       $new[$bkey][] = $value; 
      } 
     } 
    } 

$new = array(); 
recurseArray($arr,$new); 
print_r($new); 

はあなたを与える:

Array 
(
    [0] => Array 
     (
      [0] => 3 
      [1] => 8490.0000 
      [2] => 21-10-2016 11:43:18am 
      [3] => 24-11-2016 11:43:18am 
      [4] => 199 
      [5] => rtg 
     ) 

    [1] => Array 
     (
      [0] => 3 
      [1] => 8490.0000 
      [2] => 21-10-2016 11:43:18am 
      [3] => 24-11-2016 11:43:18am 
      [4] => 199 
      [5] => rtg 
     ) 

    [2] => Array 
     (
      [0] => 3 
      [1] => 8490.0000 
      [2] => 21-10-2016 11:43:18am 
      [3] => 24-11-2016 11:43:18am 
      [4] => 199 
      [5] => rtg 
     ) 

    [3] => Array 
     (
      [0] => 3 
      [1] => 8490.0000 
      [2] => 21-10-2016 11:43:18am 
      [3] => 24-11-2016 11:43:18am 
      [4] => 199 
      [5] => rtg 
     ) 
) 
+0

key = 5に基づいて値を削除したい –

+0

深みがありますか? – Rasclatt

+0

いいえ、それはサンプルのままで第2レベルにあります。深さ「n」は、利用可能であれば、一部の機密データに対するものである。 –

関連する問題