2016-10-21 3 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

Вы бы лучше сделать снята с охраны на исходном массиве:

$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). Одна заметка: он удалит любую клавишу с тем же значением, чтобы удалить любой ключ с 5. Вы бы лучше рекурсивный удалить ключ на основе значения rtg:

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

Если вам нужно искать по значению, это должно работать:

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')); 

дает вам:

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

) 

Этот последний вариант нормализует массив до одного уровня, чтобы вы могли нормально его обходить:

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

Я хочу удалить значение на основе ключа = 5 –

+0

Может ли быть на глубине? – Rasclatt

+0

Нет, он находится на втором уровне, как и в образце. Глубина 'n' предназначена для некоторых конфиденциальных данных, если они доступны. –

Смежные вопросы