2015-04-30 19 views
8

Tôi phải đối phó với việc tái cấu trúc, để giảm số dòng mã trong PHP, để lọc một mảng kết hợp. Vì vậy, tôi đang thực hiện một lựa chọn từ DB trong MySQL, để có được một mảng kết hợp. Vì vậy, "đối tượng" của tôi có một thể loại và một lĩnh vực họ.Làm thế nào để lọc một mảng kết hợp?

while ($row = mysqli_fetch_array($result)) { 
     $array[] = $row['category']; 
     $array[] = $row['Surname']; 
    } 

Tôi muốn lấy từ mảng này, như nhiều mảng phụ khác, được chia nhỏ theo danh mục. Ý tôi là danh mục Mảng nhận dạng có thể là:

$categories = array("A","B","C","D"); 

Vì vậy, điều tôi muốn, là lấy một Mảng cho mỗi Danh mục, chứa tất cả họ, thuộc danh mục đó. Vì vậy, giả sử rằng phương pháp này hoạt động, một cái gì đó như thế:

$arrayFiltered = method_filter($array_asso,"A"); 

Cuối cùng tôi muốn một cái gì đó như thế:

foreach ($categories as &$value) { 
     $arrayFiltered = method_filter($array_asso,$value); 
     my_method_which_needs_the_filtered_array($arrayFiltered); 
} 

Cảm ơn bạn trước sự giúp đỡ của bạn.

+0

Bạn cần cấu trúc bảng bình thường thích hợp trong DB !! Cách tiếp cận này bạn có (lưu trữ dữ liệu trong các giá trị được phân cách bằng dấu phẩy cho mỗi bản ghi) sẽ cho bạn nhiều nhức đầu –

+0

DB có một bảng, đó là: Danh mục, Họ là trường. Ngay bây giờ công trình, mà tôi đang làm cho mỗi thể loại, một truy vấn, nhưng điều này thêm một số chậm trễ và mã có thể được cải thiện. –

+0

, đó là: cái gì? –

Trả lời

1

Cách tiếp cận của trung sĩ là dễ nhất. Chỉ vì lợi ích của nó, đây là một cách tiếp cận với array_filter() (chỉ trong trường hợp bạn cần phải có một mảng lọc cũng):

$array = []; 
$categories = array("A","B","C","D"); 

while ($row = mysqli_fetch_array($result)) { 
    $item = [ 
     'category' => $row['category'], 
     'surname' => $row['Surname'] 
    ]; 

    $array[] = $item; 
} 

$categorized = []; 

foreach ($categories as $category) { 
    $categorized[$category] = array_filter($array, function($item) use ($category) { 
     return $item['category'] == $category; 
    }); 
} 

Đây là một bằng chứng của khái niệm mà không cần một kết nối cơ sở dữ liệu:

$categories = array("A","B","C","D"); 

$array = [ 
    ['category' => 'A', 'Surname' => 'A Name 1'], 
    ['category' => 'A', 'Surname' => 'A Name 2'], 
    ['category' => 'B', 'Surname' => 'B Name 1'], 
    ['category' => 'B', 'Surname' => 'B Name 2'], 
    ['category' => 'B', 'Surname' => 'B Name 3'], 
    ['category' => 'C', 'Surname' => 'C Name'], 
]; 

$categorized = []; 

foreach ($categories as $category) { 
    $categorized[$category] = array_filter($array, function($item) use ($category) { 
     return $item['category'] == $category; 
    }); 
} 

print_r($categorized); 

Output:

Array 
(
    [A] => Array 
     (
      [0] => Array 
       (
        [category] => A 
        [Surname] => A Name 1 
       ) 

      [1] => Array 
       (
        [category] => A 
        [Surname] => A Name 2 
       ) 

     ) 

    [B] => Array 
     (
      [2] => Array 
       (
        [category] => B 
        [Surname] => B Name 1 
       ) 

      [3] => Array 
       (
        [category] => B 
        [Surname] => B Name 2 
       ) 

      [4] => Array 
       (
        [category] => B 
        [Surname] => B Name 3 
       ) 

     ) 

    [C] => Array 
     (
      [5] => Array 
       (
        [category] => C 
        [Surname] => C Name 
       ) 

     ) 

    [D] => Array 
     (
     ) 

) 
3

Theo tôi nhận được bạn - bạn cần một mảng chứa tất cả các surnamecategory khôn ngoan để bạn có thể dễ dàng truy cập chúng. Điều này sẽ giúp -

while ($row = mysqli_fetch_array($result)) { 
    $categories[$row['category']][] = $row['Surname']; 
} 

Đơn giản chỉ cần lưu trữ các loại như key và tất cả các surname như các giá trị để key đó.

+0

Vì vậy, phần cuối cùng của mã, phải là: foreach ($ category như & $ value) { my_method_which_needs_the_filtered_array ($ categories [$ value]); } phải không? –

+0

nếu '$ category [$ value]' chứa danh mục. :) –

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