2016-06-15 9 views
2

Ich habe ein Array wie folgt:Set :: classicExtract() CakePHP 2.x Hash :: Alternative

$array = array(
    1234 => array(
     'title' => 'TitleA', 
     'extra' => array(
      45 => 'SubA', 
      54 => 'SubB', 
     ), 
     // More irrelevant data 
    ), 
    2345 => array(
     'title' => 'TitleB', 
     'extra' => array(
      89 => 'SubC', 
      98 => 'SubD', 
     ), 
     // More irrelevant data 
    ), 
); 

Ich benutze:

$data = Set::classicExtract($array, '{\d+}.title'); 

Um ein Array zu erhalten wie:

array(1234 => 'TitleA', 2345 => 'TitleB'); 

Und:

$data = Set::classicExtract($array, '{\d+}.extra'); 

ein Array erhalten wie:

array(
    1234 => array(
     45 => 'SubA', 
     54 => 'SubB', 
    ), 
    2345 => array(
     89 => 'SubC', 
     98 => 'SubD', 
    ), 
) 

Nun, da das Set :: Klasse für eine Weile veraltet ist (seit 2.2, verwenden wir 2.8) Ich möchte den Hash verwenden :: Klasse. Aber ich kann keine Funktion finden, die mir das gleiche Ergebnis bringt. Ich habe sowohl Hash :: extract() als auch Hash :: combine() ausprobiert, aber ohne Erfolg.

Ist das mit der Hash :: Klasse überhaupt möglich?

+0

Nein, ich versuche, Daten aus einem Array zu extrahieren, Verwenden der Klasse Hash :: in CakePHP 2.x. (Dokumentation: http://book.cakephp.org/2.0/en/core-utility-libraries/hash.html) – wouter

Antwort

1

Ich machte eine ähnliche Arbeit. Es wurde keine andere Lösung gefunden, sondern nur, wie der Schlüssel des Array-Elements zum Array selbst gesetzt wird. Also nur Helfer erstellt _key auf Array zu setzen:

array_walk($array, function(&$item, $key){ 
    $item['_key'] = $key; 
}); 

Dann wird alles einfach:

$result = Hash::combine($array, "{n}._key", "{n}.title"); 

und:

$result = Hash::combine($array, "{n}._key", "{n}.extra"); 
+0

Dies ist eine praktikable Lösung. Vielen Dank für Ihre Antwort. Ich wünschte, CakePHP hätte die Funktionalität nicht entfernt und die Set :: Klasse abgelehnt. – wouter