2010-03-07 40 views
5

Cách tốt nhất để loại bỏ cấp độ gốc của khóa khớp trong một Mảng đa chiều là gì? Ví dụ, giả sử chúng ta có mảng sau và tôi muốn tìm "[văn bản] = a" và sau đó xóa mảng mẹ của nó [0] ...Xóa Cha mẹ trong Mảng đa chiều PHP

(array) Array 
(

[0] => Array 
    (
     [text] => a 
     [height] => 30 
    ) 

[1] => Array 
    (
     [text] => k 
     [height] => 30 
    ) 
) 
+0

Vì vậy, bạn wan't để xóa phần còn lại của một 'parent' mảng chỉ có nút đầu tiên từ mảng 'parent'? –

+0

Hãy tưởng tượng mảng tiếp tục như, [0], [1], [2], [3] ... Tôi sẽ loại bỏ, hoặc dịch chuyển, [0] ra. – Andres

Trả lời

6

Đây là rõ ràng:

foreach ($array as $key => $item) { 
    if ($item['text'] === 'a') { 
     unset($array[$key]); 
    } 
} 
+0

hoạt động trong mảng 2 chiều, nhưng không phải trong mảng đa chiều chung. – nickf

+0

Đây là phỏng đoán đầu tiên của tôi nhưng, như bạn đã nói, nó không phải đệ quy. Có lẽ, đẩy nó nhiều hơn một chút có thể giúp đỡ ... – Andres

+0

@Andres: Vậy thì một mảng đa chiều như thế nào trông giống như nơi bạn sẽ cần đệ quy? – Gumbo

2

Mảng bên trong không duy trì bất kỳ tham chiếu nào với các mảng "cha mẹ" của chúng, vì vậy bạn phải viết một hàm để theo dõi thủ công điều này. Một cái gì đó như thế này có thể làm việc:

function searchAndDestroy(&$arr, $needle) { 
    foreach ($arr as &$item) { 
     if (is_array($item)) { 
      if (searchAndDestroy($item, $needle)) { 
       return true; 
      } 
     } else if ($item === $needle) { 
      $item = null; 
      return true; 
     } 
    } 
} 

Lưu ý rằng điều này được thiết kế để làm việc ở bất kỳ mức độ làm tổ, không chỉ là hai chiều, vì vậy nó có thể là một chút overkill nếu bạn chỉ cần nó cho những tình huống như trong ví dụ của bạn .

+0

lưu ý, khóa mảng có thể không phải là số. – mauris

+0

@thephpdeveloper: đã khắc phục sự cố đó ngay bây giờ, cảm ơn. – nickf

2

sử dụng array_filter:

function filter_callback($v) { 
    return !isset($v['text']) || $v['text'] !== 'a'; 
} 
$array = array_filter($array, 'filter_callback'); 

này sẽ chỉ rời khỏi 'yếu tố cha mẹ' trong mảng nơi text != a, do đó xóa những nơi văn bản bằng một

+0

@anonymous down-cử tri: có gì sai với giải pháp của tôi ?? – knittl

0

Triển khai của tôi:

function searchAndDestroy(&$a, $key, $val){ 
    foreach($a as $k => &$v){ 
     if(is_array($v)){ 
      $r = searchAndDestroy(&$v, $key, $val); 
      if($r){ 
       unset($a[$k]); 
      } 
     }elseif($key == $k && $val == $v){ 
      return true; 
     } 
    } 
    return false; 
} 

searchAndDestroy($arr, 'text', 'a'); 

Để kiểm tra nó:

<pre><?php 

function searchAndDestroy(&$a, $key, $val){ 
    foreach($a as $k => &$v){ 
     if(is_array($v)){ 
      $r = searchAndDestroy(&$v, $key, $val); 
      if($r){ 
       unset($a[$k]); 
      } 
     }elseif($key == $k && $val == $v){ 
      return true; 
     } 
    } 
    return false; 
} 

$arr = array(array('text'=>'a','height'=>'30'),array('text'=>'k','height'=>array('text'=>'a','height'=>'20'))); 

var_dump($arr); 

searchAndDestroy($arr, 'text', 'a'); 

var_dump($arr); 

?></pre> 

Chức năng này thực hiện nó một cách đệ quy.

0

Một giải pháp đơn giản và an toàn (tôi không xóa/yếu tố unset từ một mảng tôi Looping qua) có thể là:

$new_array = array(); 
foreach($array as $item) 
{ 
    if($item['text'] != "a") 
    { 
     $new_array[] = $item; 
    } 
} 
Các vấn đề liên quan