2015-04-30 16 views
8

Devo occuparmi di un refactoring, per ridurre il numero di righe di codice in PHP, per filtrare un array associativo. Quindi sto facendo una selezione dal DB in MySQL, per ottenere un array associativo. Quindi il mio "oggetto" ha una categoria e un campo di cognome.Come filtrare un array associativo?

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

Voglio ottenere da questo array, come molti altri sub-array, diviso per la categoria. Voglio dire l'identificazione Array categoria può essere:

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

Quindi quello che voglio, è quello di ottenere un array per ogni categoria, che contiene tutte le cognome, di tale categoria. Quindi supponiamo che il metodo funziona, qualcosa di simile:

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

Alla fine voglio qualcosa di simile:

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

vi ringrazio in anticipo per il vostro aiuto.

+0

È necessario corretta struttura della tabella normalizzata nel DB !! Questo approccio (memorizzare i dati in valori separati da virgola per record) ti darà un sacco di mal di testa –

+0

Il DB ha una tabella, che è: Categoria, Cognome come campo. In questo momento funziona, quello che sto facendo per ogni categoria, una query, ma questo aggiunge un po 'di ritardo e il codice potrebbe essere migliorato. –

+0

, che è: cosa? –

risposta

1

L'approccio del sergente è il più semplice. Solo per il gusto di farlo, qui è un approccio con array_filter() (nel caso in cui è necessario disporre di una matrice non filtrato pure):

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

Ecco una prova di concetto, senza la necessità di una connessione al database:

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

uscita:

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

Per quanto ne ho, è necessario un array che conterrà tutti gli surnamecategory in modo da poterli accedere facilmente. Questo dovrebbe aiutare -

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

È sufficiente memorizzare la categoria come key e tutto il surname come valori a quella key.

+0

Quindi, l'ultima parte del codice dovrebbe essere: foreach ($ categorie come & $ valore) { my_method_which_needs_the_filtered_array ($ categorie [$ valore]); } non è vero? –

+0

se '$ categorie [$ valore]' contiene la categoria. :) –