2014-01-21 1 views
5

У меня есть этот массив:PHP - удалить элемент в многомерном массиве

Array ( 
[0] => Array ([0] => b [1] => d [2] => **c** [3] =>a [4] =>) 

[1] => Array ([0] => **c** [1] => a [2] => d [3] => [4] =>) 

[2] => Array ([0] => b [1] => d [2] => a [3] => [4] =>) 

[3] => Array ([0] => **c** [1] => d [2] => a [3] =>b [4] =>) 

) 

и нужно удалить (снята с охраны?) Все элементы, где значение «с», так что один заканчивается:

Array ( 
[0] => Array (**[0] => b [1] => d [2] => a [3] => [4] =>**) 

[1] => Array (**[0] => a [1] => d [2] => [3] =>**) 

[2] => Array ([0] => b [1] => d [2] => a [3] => [4] =>) 

[3] => Array (**[0] => d [1] => a [2] =>b [3] =>**) 

) 

Элемент удаляется, а остальные элементы перемещаются вверх. Я знаю, что unset не переиндексирует массив. Невозможно отключиться для всех многомерных массивов, но только с одним массивом. Могут ли массивы быть повторно проиндексированы впоследствии? Ценить это.

Код BELOW удаляет элементы, где значение равно «c», но индекс первого элемента не переиндексирован. Может ли кто-нибудь предложить решение для повторной индексации внутренних массивов?

$i=0; 
foreach ($array as $val) 
    { 
    foreach ($val as $key => $final_val) 
     { 

     if ($final_val =="$search_value") 
      { 
      unset($array[$i][$key]); 
      } 
     } 
    i = $i + 1; 
    } 
+0

Что вы ожидаете от размеров массива после этого? В общем, это не будет прямоугольник. Вам, вероятно, нужно взглянуть на концепцию ** редких массивов **, если вам действительно интересно, что это 2D, и что некоторые элементы «один раз» (хотя даже в разреженных массивах «ушел» на самом деле просто означает «ноль»). Могли бы вы не назначить их NaN? Что вы на самом деле после? ... – Floris

+0

Флорис - не уверен, что вы подразумеваете под этим. Я ищу простое удаление любых элементов, где оно имеет определенное значение. – FartMachine4U

ответ

6

Следующий код будет делать то, что вы хотите:

<?php 
$a = 1; 
$b = 2; 
$c = 3; 
$d = 4; 

$arr = array(
array ($b, $d, $c, $a, $b), 
array ($c, $a), 
array ($b, $d, $c), 
array($c, $d, $a, $b, $b) 
); 
echo "before:\n"; 
print_r($arr); 

foreach($arr as $k1=>$q) { 
    foreach($q as $k2=>$r) { 
    if($r == $c) { 
     unset($arr[$k1][$k2]); 
    } 
    } 
} 
echo "after:\n"; 
print_r($arr); 
?> 

Выход:

before: 
Array 
(
    [0] => Array 
     (
      [0] => 2 
      [1] => 4 
      [2] => 3 
      [3] => 1 
      [4] => 2 
     ) 

    [1] => Array 
     (
      [0] => 3 
      [1] => 1 
     ) 

    [2] => Array 
     (
      [0] => 2 
      [1] => 4 
      [2] => 3 
     ) 

    [3] => Array 
     (
      [0] => 3 
      [1] => 4 
      [2] => 1 
      [3] => 2 
      [4] => 2 
     ) 

) 
after: 
Array 
(
    [0] => Array 
     (
      [0] => 2 
      [1] => 4 
      [3] => 1 
      [4] => 2 
     ) 

    [1] => Array 
     (
      [1] => 1 
     ) 

    [2] => Array 
     (
      [0] => 2 
      [1] => 4 
     ) 

    [3] => Array 
     (
      [1] => 4 
      [2] => 1 
      [3] => 2 
      [4] => 2 
     ) 

) 

Как вы можете см., все 3 ушли. ..

1

Искать значение в подмножестве, затем отмените его.

$search = 'c'; 
$result = array_map(function ($value) use ($search) { 
    if(($key = array_search($search, $value)) !== false) { 
     unset($value[$key]); 
    } 
    return $value; 
}, $your_array); 

Или вы могли бы использовать цикл тоже:

// this way change your original array 
foreach ($your_array as &$sub_array) { 
    if(($key = array_search($search, $sub_array)) !== false) { 
     unset($sub_array[$key]); 
    } 
} 
var_dump($your_array);