2016-05-15 10 views
0

Ich habe dieses 3D-Array und ich versuche, es durch das Feld "Kategorien" im inneren Array zu filtern, aber ich kann es nicht ganz richtig bekommen.PHP Filter ein 3D-Array durch die verschiedenen Werte eines Schlüssels

Array(
'type' => 'success', 
'value => array (
    0 => array (
     'id' => 1, 
     'joke' => 'Chuck Norris uses ribbed condoms inside out, so he gets the pleasure.', 
      'categories' => array()); 
    1 => array (
      'id' => 2, 
      'joke' => 'MacGyver can build an airplane out of gum and paper clips. Chuck Norris can kill him and take it.', 
      'categories' => array(    
      [0] => nerdy       
      )); 
    ); 
); 

Ich habe versucht mit Array_filter, aber ich kann es nicht zum arbeiten bekommen.

Danke!

+0

bitte Ihren aktuellen Code – Barry

Antwort

0

Ich bin mir nicht sicher, ob dies eine gute Lösung oder nicht auf die Frage ist - und ebenso, nicht sicher, ob es sicher ist, den Wert von $ x [ ‚value‘] nach der Filterung zu ändern, aber in Bezug auf mit array_filter, dem folgenden täte Filter auf dem Kategoriewert: können

class Filter { 
    private $string = ''; 

    public function __construct($string2) { 
     $this->string = $string2; 
    } 

    public function catfilter($x) { 
     if(in_array($this->string, $x['categories'])) { 
      return true; 
     } 
    } 

    public function filter($x) { 
     $t = array_filter($x['value'], array($this, "catfilter")); 
     $x['value'] = $t; 
     return $x; 
    } 


} 

$x = array(
'type' => 'success', 
'value' => array (
    '0' => array (
     'id' => '1', 
     'joke' => 'C', 
      'categories' => array()), 
    '1' => array (
      'id' => '2', 
      'joke' => 'M', 
      'categories' => array(   '0' => 'nerdy') ) 
    ) 
); 

$f = new Filter('nerdy'); 
print_r($f->filter($x)); 
+0

Dank hinzufügen viel, es funktioniert ganz rigth Dank viel, jetzt was soll ich tun, wenn ich will um diejenigen ohne Kategorien zu filtern, mit dem Code, wie er ist, werden sie nicht angezeigt. –

+0

Immer chaotisch - aber könnte tun: öffentliche Funktion c ($ x) { if (leer ($ x ['Kategorien'])) { zurück True; } } öffentliche Funktion emptyfilter ($ x) { $ t = array_filter ($ x [ 'Wert'], array ($ this "c")); $ x ['Wert'] = $ t; zurückgeben $ x; } –

+0

Es funktioniert, vielen Dank! –

0

Unter der Annahme, nennen Sie Ihre 3D-Array $data, die Sie verwenden:

if($data['type'] == 'success'){ 
    $results = filter_by_category($data['value'],'nerdy') 
} 

nur den 2D-Teil Ihres Array übergeben, um die Filterfunktion.

Dann können Sie den Datensatz mit etwas wie folgt filtern:

function filter_by_category($dataset, $category){ 
    // define an empty array to populate with the results 
    $output = array(); 

    // iterate the dataset 
    foreach($dataset as $row){ 
     // check if the category we are looking for exists in this row 
     if(in_array($category,$row['categories'])){ 
      // if it does, add it to the output array 
      $output[] = $row; 
     } 
    } 
    return $output; 
}