2011-08-09 40 views
7

Tôi đã tìm kiếm một giải pháp cho điều này mà không thành công thực sự. Tôi có một loạt các bậc cha mẹ và con cái không có giới hạn về chiều sâu. Này được tạo ra từ một cơ sở dữ liệu nhưng vấn đề là ID mục trở thành chìa khóa bằng cách của tôi sắp xếp một mảng phẳng thành một mảng đa chiều như vậy:Đặt lại các khóa mảng trong mảng đa chiều

Array(

[28] => Array 
     (
      [id] => 28 
      [color] => #ff24e5 
      [name] => Personal 
      [parent_id] => 
      [children] => Array 
       (
        [23] => Array 
         (
          [id] => 23 
          [color] => #41c3a3 
          [name] => Shopping 
          [parent_id] => 28 
          [children] => Array 
           (
            [22] => Array 
             (
              [id] => 22 
              [color] => #8be32b 
              [name] => Deals 
              [parent_id] => 23 
              [children] => Array 
               (
               ) 
             ) 
           ) 
         ) 

        [150] => Array 
         (
          [id] => 150 
          [color] => #e9a3f0 
          [name] => Orders 
          [parent_id] => 28 
          [children] => Array 
           (
           ) 
         ) 
       ) 
     ) 
) 

Những gì tôi muốn, là một chức năng mà không được sau:

Array (
[0] => Array 
     (
      [id] => 28 
      [color] => #ff24e5 
      [name] => Personal 
      [parent_id] => 
      [children] => Array 
       (
        [0] => Array 
         (
          [id] => 23 
          [color] => #41c3a3 
          [name] => Shopping 
          [parent_id] => 28 
          [children] => Array 
           (
            [0] => Array 
             (
              [id] => 22 
              [color] => #8be32b 
              [name] => Deals 
              [user_id] => 1 
              [selected] => 0 
              [parent_id] => 23 
              [children] => Array 
               (
               ) 
             ) 
           ) 
         ) 

        [1] => Array 
         (
          [id] => 150 
          [color] => #e9a3f0 
          [name] => Orders 
          [parent_id] => 28 
          [children] => Array 
           (
           ) 
         ) 
       ) 
     ) 
) 

Về cơ bản phân công lại phím bắt đầu từ 0. tôi đã thử nhiều phương pháp, nhưng tôi giả định rằng tôi cần phải tìm một giải pháp đệ quy và khi tôi cố gắng đó, nó phá hủy mảng của tôi. Tôi đã đọc lên trên array_walk_recursive() chức năng, nhưng tôi không hoàn toàn biết phải làm gì ngoài đó. Về cơ bản, có cách nào để thiết lập lại các phím số trong một mảng đa chiều?

Cảm ơn sự giúp đỡ!

+0

Tôi đã trả lời câu hỏi của bạn chỉ sau khi bạn hỏi nó. Đó là 2 giờ sau, bạn sẽ quay trở lại? Nếu điều này trả lời câu hỏi của bạn, vui lòng nhấp vào biểu tượng dấu kiểm bên cạnh câu trả lời để đánh dấu câu hỏi đó là đã được chấp nhận. –

Trả lời

12
function fix_keys($array) { 
    foreach ($array as $k => $val) { 
    if (is_array($val)) 
     $array[$k] = fix_keys($val); //recurse 
    } 
    return array_values($array); 
} 
+0

Giải pháp tuyệt vời, thanh lịch +1 – RageD

+0

Tuyệt vời! Cảm ơn. Không nhận được email, vì vậy tôi chỉ kiểm tra ngay bây giờ. – flicker

+1

Điều này làm việc nhưng tôi đang mất các phím mảng không phải là số, làm thế nào tôi sẽ đi về chỉ nhượng lại các phím số? Cảm ơn – flicker

11

Tôi đã cố gắng để sửa chữa các vấn đề tương tự, đây là mã

$array = array_values($array); 
10

Bạn thực sự cần phải thêm điều kiện is_numeric ngừng phím văn bản nhận được trộn lẫn ...

function fix_keys($array) { 

    foreach ($array as $k => $val) { 

     if (is_array($val)) 
      $array[$k] = $fix_keys($val); //recurse 
    } 

    if(is_numeric($k)) 
     return array_values($array); 

    return $array; 
} 

Tôi đã thực hiện việc này thay thế:

function fix_keys($array) { 
    $numberCheck = false; 
    foreach ($array as $k => $val) { 
     if (is_array($val)) $array[$k] = fix_keys($val); //recurse 
     if (is_numeric($k)) $numberCheck = true; 
    } 
    if ($numberCheck === true) { 
     return array_values($array); 
    } else { 
     return $array; 
    } 
} 
+0

Tuyệt vời! Điều này làm việc rực rỡ cho tôi, trong khi câu trả lời chính xác hiện tại thì không. – Patrick