Cây trong php

Là một nhà phát triển Drupal giỏi, một trong những mục tiêu trong năm mới của bạn là tìm hiểu thêm các tính năng của PHP. Hôm nay, chúng ta sẽ nói về việc lặp lại dữ liệu có cấu trúc cây bằng cách sử dụng lớp có tên khó hiểu là RecursiveIteratorIterator

Khi nói đến mảng, PHP có rất nhiều công cụ hữu ích mà bạn đã biết, chẳng hạn như
in_array, array_map và preg_grep. Nhưng còn cấu trúc cây thì sao? . thư mục trên hệ thống tệp của bạn, menu Drupal, thuật ngữ phân loại phân cấp, cây DOM, v.v. Bạn có thể xử lý chúng bằng các vòng lặp và đệ quy nhưng nó khá phức tạp—chỉ cần nhìn vào nguồn của file_scan_directory để biết ý tôi là gì. Sẽ không dễ dàng hơn nếu bạn chỉ có thể sử dụng các hàm mảng của PHP trên cây sao?

Chúng tôi sẽ sử dụng RecursiveIteratorIterator tích hợp để làm phẳng cấu trúc cây và làm cho chúng dễ xử lý hơn nhiều. Bạn chỉ cần cung cấp cho hàm tạo RecursiveIteratorIterator một RecursiveIterator, hàm này cho nó biết cách duyệt qua cây cụ thể đang được đề cập—ví dụ: RecursiveDirectoryIterator biết cách lặp lại vào các thư mục. Sau đó, bạn có thể lặp lại toàn bộ cấu trúc phân cấp chỉ trong một vòng lặp foreach đơn giản. Đây là một ví dụ

// Create a RecursiveIterator that knows how to follow subdirectories.
$recursive_iter = new RecursiveDirectoryIterator['.', FilesystemIterator::SKIP_DOTS];

// Pass the RecursiveIterator to the constructor of RecursiveIteratorIterator.
$recursive_iter_iter = new RecursiveIteratorIterator[
  $recursive_iter,
  // Also pass in a 'mode', to specify whether parents should come before children,
  // after children, or not at all. We want parents first, so we use SELF_FIRST.
  RecursiveIteratorIterator::SELF_FIRST
];

// Use our RecursiveIteratorIterator as if it was a flat array.
foreach [$recursive_iter_iter as $path => $info] {
  print "$path\n";
}

// Or process it with standard array functions!
$pngs = preg_grep['/\.png$/', iterator_to_array[$recursive_iter_iter]];
foreach [$pngs as $path => $info] {
  print "png: $path\n";
}

Menu trong Drupal cũng là cây và chúng có thể khá phức tạp để xử lý. Vì vậy, hãy thử sử dụng phương pháp tương tự như trên, nhưng lần này là cho các menu

Thật không may, không có RecursiveIterator tích hợp sẵn cho cây menu, như RecursiveDirectoryIterator là thư mục. Vì vậy, thay vào đó, chúng ta phải xây dựng của riêng mình, bằng cách phân lớp một trình vòng lặp hiện có và triển khai getChildren[]hasChildren[]. Đó là một chút công việc, nhưng sau đó chúng ta có thể dễ dàng xử lý một menu phân cấp hoàn chỉnh chỉ trong một vài dòng mã

Chủ Đề