web-dev-qa-db-ja.com

array_mapがクラスで機能しない

配列を処理するためのクラスを作成しようとしていますが、array_map()で動作するように思えません。

_<?php
//Create the test array
$array = array(1,2,3,4,5,6,7,8,9,10);
//create the test class
class test {
//variable to save array inside class
public $classarray;

//function to call array_map function with the given array
public function adding($data) {
    $this->classarray = array_map($this->dash(), $data);
}

// dash function to add a - to both sides of the number of the input array
public function dash($item) {
    $item2 = '-' . $item . '-';
    return $item2;
}

}
// dumps start array
var_dump($array);
//adds line
echo '<br />';
//creates class object
$test = new test();
//classes function adding
$test->adding($array);
// should output the array with values -1-,-2-,-3-,-4-... 
var_dump($test->classarray);
_

これは出力

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 D:\xampp\htdocs\trainingdvd\arraytesting.php on line 11 and defined in D:\xampp\htdocs\trainingdvd\arraytesting.php on line 15

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

何が間違っているのですか、この機能はクラス内で機能しないのですか?

40
Justin

dashを間違った方法でコールバックとして指定しています。

これは動作しません:

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

これは:

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

コールバックが取る可能性のあるさまざまな形式について読む here

121
Jon

こんにちはこのように使用できます

    // 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 );
29

array_map($this->dash(), $data)は、引数なしで$this->dash()を呼び出し、戻り値をコールバック関数として使用して、配列の各メンバーに適用します。代わりにarray_map(array($this,'dash'), $data)が必要です。

2
Anomie

読まなければならない

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

array- thingは、オブジェクトインスタンスメソッドの PHPコールバック です。通常の関数へのコールバックは、関数名(_'functionName'_)を含む単純な文字列として定義され、静的メソッド呼び出しはarray('ClassName, 'methodName')またはそのような文字列として定義されます:_'ClassName::methodName'_(これは動作しますPHP 5.2.3)の時点。

1
Stefan Gehrig