2016-05-10 7 views
1

Ich arbeite an einem Skript, das Daten verarbeitet, die von einem Drittanbieter-Webdienst übermittelt werden, den ich nicht kontrolliere. Ich muss einige der vom Benutzer eingereichten Daten bereinigen. Insbesondere muss ich jedes Array durchgehen und alle Vornamen und Nachnamen neu formatieren, um sicherzustellen, dass sie richtig groß geschrieben sind (Ernest Hemingway statt ERNEST HEMINGWAY).Anwenden von PHP-Funktion auf bestimmte Schlüssel in einem Array

Ich habe ucwords (strtolower()) verwendet, um die Großschreibung zu beheben, aber ich muss diese Methode auf alle Werte anwenden, die in den Schlüsseln first_name und last_name in jedem Array gespeichert sind. Es gibt andere Zeichenfolgen, die ich nicht ändern möchte, nur die Werte first_name und last_name. Hier ist ein Beispiel des Arrays:

Array 
(
    [authors] => Array 
      (
       [0] => Array 
        (
         [first_name] => Ernest 
         [last_name] => HEMINGWAY 
         [book] => Too many to mention, but I like the Sun Also Rises 
       [1] => Array 
        (
         [first_name] => john 
         [last_name] => steinbeck 
         [book] => East of Eden 
    ) 

    [actors] => Array 
      (
       [0] => Array 
        (
         [first_name] => jOhn 
         [last_name] => WAYNE 
         [occupation] => Just generally a bad dude. 
       [1] => Array 
        (
         [first_name] => clint 
         [last_name] => eastwood 
         [occupation] => Go ahead. Make my day. 
    ) 
) 

Irgendwelche Gedanken darüber, wie kann ich eine Schleife durch jede Anordnung und gilt ucwords (strtolower()), um nur die first_name und last_name Werte? Es gibt eine Menge von Arrays, die das brauchen, daher hoffe ich, die Werte first_name und last_name programmatisch finden und formatieren zu können. Das Array-Format muss dieselbe Nachbearbeitung sein, wobei nur die Werte geändert werden.

EDIT: Ich bin sicher, dass, wie unten vorgeschlagen, array_walk_recursive ist der Weg zu gehen. Ich konnte es nicht zur Arbeit bringen, aber ich habe eine neue Methode entwickelt, die diese Aufgabe erfüllt. Hier ist es als Referenz:

protected function _fixCase(array $data) 
{ 
    $newData = $data; 
    foreach ($newData as $key => $value) { 
     switch (true) { 
      case stristr($key, 'first_name') || stristr($key, 'last_name'); 
       $newData[$key] = ucwords(strtolower($value)); 
       break; 
      default: 
       ''; 
     } 
    } 
    return $newData; 
} 
+0

möchten Sie vielleicht einen Blick auf 'array_walk_recursive' werfen. Der zweite Parameter, den Sie in der Callback-Funktion erhalten, ist der Schlüssel. Prüfen Sie also, ob dieser Wert gleich 'first_name' oder' last_name' ist, bevor Sie die Bereinigung anwenden. http://php.net/manual/en/function.array-walk-recursive.php – Pevara

+0

Beachten Sie, dass nicht alle Namen auf diese Weise richtig groß geschrieben werden. –

Antwort

2

Recursively walk the array with a callback:

array_walk_recursive($array, function(&$item, $key) { 
     if ($key === 'first_name' || $key === 'last_name') { 
      $item = ucwords(strtolower($item)); 
     } 
    } 
); 

Dadurch werden die Elemente an Ort und Stelle (&$item) ändern, wenn die $key übereinstimmt, was Sie ändern möchten.

+0

Das macht meinen Kommentar etwas überflüssig ... Etwas mit Verstand und großartig und gleich;) – Pevara

+0

Danke für die Information. Ich konnte array_walk_recursive nicht zur Arbeit bringen, aber ich bin mir sicher, dass dies auf meine eigenen Einschränkungen zurückzuführen ist. Ich habe am Ende eine Funktion erstellt, die wahrscheinlich weniger elegant ist, aber die Arbeit erledigt. – lexomatic

Verwandte Themen