2015-04-30 46 views
8

我必须处理重构,以减少PHP中代码的行数,以过滤关联数组。 因此,我正在从MySQL中的数据库中进行选择,以获得关联数组。所以我的“对象”有一个类别和一个姓氏字段。如何筛选关联数组?

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

我想从这个数组中获取其他许多子数组,按类别分割。我的意思是该类别阵列识别可能是:

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

所以我想要的东西,是获得每个类别一个数组,其中包含所有姓这一类的。 因此,假设该方法的工作原理,类似的东西:

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

最后我想这样的事情:

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

预先感谢您的帮助。

+0

你需要在适当的DB标准化的表结构!你有这种方法(以逗号分隔的数据存储数据)会给你很多头痛 –

+0

DB有一个表,它是:Category,Surname as field。现在工作,我正在为每个类别做一个查询,但这会增加一些延迟,代码可能会改进。 –

+0

,这是:什么? –

回答

1

警长的方法是最简单的。只是为了它的缘故,这里是array_filter()(以防万一,你必须有一个未经过滤的阵列以及)的方法:

$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; 
    }); 
} 

这里是概念,而不需要一个数据库连接的证明:

$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); 

输出:

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

就我而言 - 你需要一个数组,它将包含所有的surnamecategory明智的,以便您可以轻松访问它们。这应该有助于 -

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

只是存储类别为key和所有surname作为值到key

+0

因此,代码的最后部分应该是:foreach($ categories as&$ value){ my_method_which_needs_the_filtered_array($ categories [$ value]); }不是吗?如果'$ categories [$ value]'包含类别,则为 –

+0

。 :) –