2014-09-18 9 views
6

mam tej tablicy:PHP usunąć sub-tablicę z wielowymiarowej tablicy przez wartość klucza sub-array

array(5) { 
    [0]=> 
    array(4) { 
    ["nachricht"]=> 
    string(9) "blablaaaa" 
    ["user"]=> 
    string(15) "334607943355808" 
    ["datum"]=> 
    string(16) "18.09.2014 11:13" 
    ["deleted"]=> 
    string(0) "" 
    } 
    [1]=> 
    array(4) { 
    ["nachricht"]=> 
    string(3) "joo" 
    ["user"]=> 
    string(15) "334607943355808" 
    ["datum"]=> 
    string(16) "18.09.2014 11:56" 
    ["deleted"]=> 
    string(15) "334607943355808" 
    } 
    [2]=> 
    array(4) { 
    ["nachricht"]=> 
    string(4) "noma" 
    ["user"]=> 
    string(15) "334607943355808" 
    ["datum"]=> 
    string(16) "18.09.2014 11:56" 
    ["deleted"]=> 
    string(0) "" 
    } 
    [3]=> 
    array(4) { 
    ["nachricht"]=> 
    string(4) "test" 
    ["user"]=> 
    string(15) "334607943355808" 
    ["datum"]=> 
    string(16) "18.09.2014 11:56" 
    ["deleted"]=> 
    string(0) "" 
    } 
    [4]=> 
    array(4) { 
    ["nachricht"]=> 
    string(4) "doh!" 
    ["user"]=> 
    string(15) "334607943355808" 
    ["datum"]=> 
    string(16) "18.09.2014 11:56" 
    ["deleted"]=> 
    string(0) "" 
    } 
} 

chcę usunąć wszystkie tablice podrzędne, które obejmują wartość 334607943355808 w „usunięty” kluczem tablica podrzędna. Mam ten kod:

if(($key = array_search("334607943355808", $array)) !== false) { 
      unset($array[$key]); 
     } 

od: PHP array delete by value (not key) gdzie jest zakaz multi-array, ale w jaki sposób mogę to zrobić w moim przypadku?

EDIT:

tryed to w ten sposób teraz:

foreach($array as $delete){ 
     if(($key = array_search("334607943355808", $delete)) !== false) { 
       unset($delete[$key]); 
     } 
} 

Ale to nie działa

+0

trzeba rekursji. –

+1

Użyj zagnieżdżonej pętli foreach i sprawdź wartości, czy zawierają Twój numer? – TheOneWhoSighs

+0

nie jest tak elastyczny, ale w takim przypadku zadziała równie dobrze. –

Odpowiedz

5

Wystarczy prosty foreach z odniesieniem do sub tablicy:

foreach($array as &$sub_array) { 
    if($sub_array['deleted'] == '334607943355808') { 
     $sub_array = null; 
     break; //if there will be only one then break out of loop 
    } 
} 

Lub według klucza w tablicy głównej:

foreach($array as $key => $sub_array) { 
    if($sub_array['deleted'] == '334607943355808') { 
     unset($array[$key]); 
     break; //if there will be only one then break out of loop 
    } 
} 

Można także wyodrębnić wartości deleted, szukaj i rozbrojony przez klucz:

if(($key = array_search('334607943355808', 
         array_column($array, 'deleted'))) !== false) { 
    unset($array[$key]); 
} 
+1

Polecam 'break;' po 'unset (...)', aby uniknąć niepotrzebnych pętli. – Fr0zenFyr

0

Można użyć array_map() .Try to

$finalArr = array_map(function($v){ 
    if($v['deleted'] == '334607943355808') unset($v['deleted']); 
    return $v; 
}, $arr);