Wie man Klassenmethoden in aufrufbaren array_maps implementiert [duplicate]

Lesezeit: 3 Minuten

Justins Benutzer-Avatar
Justin

Ich versuche, eine Klasse zu erstellen, um Arrays zu behandeln, aber ich kann es anscheinend nicht bekommen array_map() darin zu arbeiten.

$array = [1,2,3,4,5,6,7,8,9,10];
class test {
    public $values;

    public function adding($data) {
        $this->values = array_map($this->dash(), $data);
    }

    public function dash($item) {
        return '-' . $item . '-';
    }

}

var_dump($array);

$test = new test();
$test->adding($array);

// Expected: -1-,-2-,-3-,-4-... 
var_dump($test->values);

Dies gibt aus

array(10) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10) }

Warning: Missing argument 1 for test::dash(), called in [...]\arraytesting.php on line 11 and defined in [...]\arraytesting.php on line 15

Warning: array_map() expects parameter 1 to be a valid callback, function '--' not found or invalid function name in [...]\arraytesting.php on line 11 NULL

Was mache ich falsch oder funktioniert diese Funktion innerhalb von Klassen einfach nicht?

Jons Benutzeravatar
Jon

Sie spezifizieren dash als Rückruf in die falsche Richtung.

Das funktioniert nicht:

$this->classarray = array_map($this->dash(), $data);

Das macht:

$this->classarray = array_map([$this, 'dash'], $data);

Lesen Sie mehr über die verschiedenen Formen eines Rückrufs hier.

  • Danke für die schnelle Wiederholung. Ich habe es funktioniert und danke für deine Hilfe. Ich habe mich nur gefragt, ob Sie zufällig mehr Artikel über Rückrufe haben und wie Sie angeben, ob dies korrekt ist?

    – Justin

    24. März 2011 um 16:49 Uhr

  • @Justin: Schau mal hier: stackoverflow.com/questions/48947/…

    – Jon

    24. März 2011 um 19:01 Uhr

  • funktioniert sogar statisch wie array_map( @[ self, ‘dash’ ] )

    – Bortunac

    25. Juni 2016 um 22:53 Uhr


  • Wie können Sie einen Parameter mit der Dash-Funktion übergeben?

    – Nielsapp

    10. Mai 2018 um 11:33 Uhr


  • @Nielsapp Sie können nicht direkt, Sie müssen eine aufrufbare übergeben, die die gewünschten Argumente effektiv bindet, z array_map(function($item) { return $this->dash($item, 'additional argument'); }, $data)

    – Jon

    14. Mai 2018 um 9:49 Uhr

Bei Verwendung einer Klassenmethode als Callback für Funktionen wie array_map() und usort(), müssen Sie den Callback als zweiwertiges Array senden. Der 2. Wert ist immer der Name der Methode als String. Der 1. Wert ist der Kontext (Klassenname oder Objekt)

// Static outside of class context
array_map( array( 'ClassName', 'methodName' ), $array );

// Static inside class context
array_map( array( __CLASS__, 'methodName' ), $array );

// Non-static outside of object context
array_map( array( $object, 'methodName' ), $array );

// Non-static inside of object context
array_map( array( $this, 'methodName' ), $array );

array_map($this->dash(), $data) Anrufe $this->dash() mit 0 Argumenten und verwendet den Rückgabewert als Callback-Funktion, die auf jedes Mitglied des Arrays angewendet wird. Sie wollen array_map(array($this,'dash'), $data) stattdessen.

Es muss gelesen werden

$this->classarray = array_map(array($this, 'dash'), $data);

Das array-Ding ist das PHP-Callback für eine Objektinstanzmethode. Rückrufe zu regulären Funktionen werden als einfache Zeichenfolgen definiert, die den Funktionsnamen enthalten ('functionName'), während statische Methodenaufrufe definiert sind als array('ClassName, 'methodName') oder als String so: 'ClassName::methodName' (funktioniert ab PHP 5.2.3).

array_map nimmt ein zurückrufen als erster Parameter.

Und ein Rückruf zu einer statischen Methode wird wie folgt geschrieben:

array('classname', 'methodname')

Das bedeutet, dass Sie in Ihrem speziellen Fall Folgendes verwenden würden:

array_map(array('stripSlashesRecursive', ''), $value);

Für weitere Informationen über Rückrufesiehe diesen Abschnitt des PHP-Handbuchs : In dieser Dokumentation verwendete Pseudotypen und Variablen – Callback.

Benutzeravatar von Aris
Aris

Falls die Klasse zu einem anderen Namensraum gehört, müssen Sie den vollständigen Klassennamen des Namensraums verwenden. Unten ist ein Beispiel mit einer CakePHP Utility-Klasse:

Das wird nicht funktionieren:

array_map(array('Inflector', 'humanize'), $some_array));

Das wird funktionieren:

array_map(array('Cake\Utility\Inflector', 'humanize'), $some_array));

Benutzeravatar von aefxx
aefxx

array_map( array('Sanitize', 'stripSlashesRecursive'), $value) ...

1434220cookie-checkWie man Klassenmethoden in aufrufbaren array_maps implementiert [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy