2011-08-20 46 views
9

Làm cách nào để xóa phần tử khỏi mảng đa chiều được cung cấp khóa?Xóa phần tử khỏi mảng đa chiều dựa trên khóa

Tôi hy vọng điều này sẽ tham lam để nó xóa tất cả các phần tử trong một mảng khớp với các khóa mà tôi truyền vào. Tôi có điều này cho đến nay tôi có thể duyệt qua mảng đa chiều nhưng tôi không thể bỏ đặt chính tôi cần phải vì tôi không có một tham chiếu đến nó!

function traverseArray($array, $keys) 
{ 
    foreach($array as $key=>$value) 
    { 
     if(is_array($value)) 
     { 
      traverseArray($value); 

     } else { 

      if(in_array($key, $keys)) 
      {      
       //unset(what goes here?) 

      } 

     } 
    } 

} 
+0

Tôi nghĩ rằng 'Thời gian gọi tham chiếu đã không được chấp nhận'. Đặc biệt là kể từ khi tôi sử dụng điều này trong một lớp học trong Code-igniter. – Abs

Trả lời

8

Các mã sau đây làm việc (và không sử dụng công cụ hỗ trợ), chỉ cần kiểm tra nó :

function traverseArray(&$array, $keys) { 
    foreach ($array as $key => &$value) { 
    if (is_array($value)) { 
     traverseArray($value, $keys); 
    } else { 
     if (in_array($key, $keys)){ 
     unset($array[$key]); 
     } 
    } 
    } 
} 
+0

Điều này rất hữu ích, cảm ơn @Marian.Nếu bất kỳ ai sử dụng điều này và muốn thực hiện kiểm tra trên VALUE của phần tử bạn đang xóa, bạn có thể kiểm tra '$ value' ngay trước khi thực hiện' unset() '; – Jimbo

0

Bạn có thể làm điều này

unset($array[$key]); 

$array sẽ không phải là một bản sao của mảng ban đầu, chỉ cần một tham chiếu đến nó, vì vậy bất kỳ sửa đổi sẽ tổ chức.

Ngoài ra, bạn có một lỗi nhỏ trong đoạn mã của mình: khi bạn thực hiện cuộc gọi đệ quy, bạn quên thông số $keys.

+1

Chỉ khi bạn vượt qua tham chiếu ... Mà không phải là mặc định afaik ... – sg3s

+0

@ sg3s trong phiên bản mới (php5.x, không biết chắc chắn) đó là mặc định + thông tin tham chiếu " $ var' không được chấp nhận. Xem câu trả lời này (http://stackoverflow.com/questions/6138454/php-arrays-and-pass-by-reference) để làm rõ. –

+0

Tôi khá chắc chắn quyền sg3 của @. Các '&' trong một cuộc gọi chức năng, như 'foo (&$a);' không được chấp nhận theo hướng dẫn, nhưng nếu không nó nói 'function foo (& $ var) {'. – joakimdahlstrom

1

Bạn có thể sử dụng vượt qua bằng cách tham khảo, kê khai chức năng của bạn như thế này:

function traverseArray(&$array, $keys) 
{ 
    foreach($array as $key=>$value) 
    { 
     if(is_array($value)) 
     { 
      traverseArray($value, $keys); 
     }else{ 
      if(in_array($key, $keys)){ 
       unset($array[$key]); 
      } 
     } 
    } 
} 

sau đó bạn có thể bỏ đặt chìa khóa và nó sẽ biến mất từ ​​giá trị thông qua gốc quá kể từ khi $array trong hàm chỉ đơn thuần là một con trỏ với mảng bạn đã truyền để nó cập nhật mảng đó.

unset($array[$key]); 

Để biết thêm thông tin kiểm tra php documentation on passing by reference

+0

Tôi nhận được thông báo này 'Call-time pass-by- Tôi đang sử dụng điều này trong một lớp học trong Codeigniter – Abs

+0

Tôi đã chỉnh sửa câu trả lời của tôi để bao gồm toàn bộ chức năng của bạn.Ngoài ra bạn cần phải chắc chắn rằng khi bạn gọi nó, bạn sử dụng 'traverseArray ($ array, $ keys)' và ** not ** 'traverseArray (& $ array, $ keys)' – sg3s

+0

Phải, tôi không nhận được lỗi đó nữa.Tuy nhiên, mảng cũng giống như trước.Tôi tự hỏi điều này có thực sự hoạt động trong một lớp không? Tôi gọi hàm trên từ một hàm khác trong một lớp và hàm này không trả về bất cứ thứ gì. Cách tôi gọi nó là như sau: '$ this-> traverseArray ($ errors, array ('e1', 'e2')); ' – Abs

0

và đừng quên để sửa đổi foreach:

foreach($array as $key=>&$value) 
+0

Bạn không cần phải làm điều này một khi một biến được tham chiếu nó sẽ mang nó đến tất cả các sử dụng của biến đó afaik (ai đó cảm thấy để kiểm tra điều này?: P) – sg3s

+0

Bạn không thể thay đổi giá trị mảng trong foreach. –

+0

Lý do giảm giới hạn là gì? –

Các vấn đề liên quan