0

'array_map'などのPHP関数はコールバックを受け取ります。これは、単純な関数、クラスまたはオブジェクトメソッドのいずれかです。

$array2 = array_map('myFunc', $array);  

また

$array2 = array_map(array($object, 'myMethod'), $array);

しかし、反復内で現在のオブジェクトにバインドされているメソッドを渡すための構文はありますか(Prototype.jsの「invoke」など)?以下を使用できるように:

$array2 = array_map('myMethod', $array);

の効果で

foreach($array as $obj) $array2[] = $obj->myMethod();

明らかに、このフォームを使用することも、ラッパー関数を記述して呼び出しを行うことも、インラインで行うこともできます。しかし、「myMethod」はすでにメソッドであるため、これらのいずれかを実行する必要があるため、家の中を回っているようです。

4

6 に答える 6

0
<?php

// $obj->$method(); works, where $method is a string containing the name of the
// real method
function array_map_obj($method, $array) {
    $out = array();

    foreach ($array as $key => $obj)
        $out[$key] = $obj->$method();

    return $out;    
}

// seems to work ...

class Foo {
    private $y = 0;
    public function __construct($x) {
        $this->y = $x;
    }
    public function bar() {
        return $this->y*2;
    }
}

$objs = array();
for ($i=0; $i<20; $i++)
    $objs[] = new Foo($i);

$res = array_map_obj('bar', $objs);

var_dump($res);

?>

出来上がり!

于 2009-05-05T14:32:57.657 に答える
0

これはちょっとばかげた答えですが、ArrayObject をサブクラス化して、通常の配列の代わりにそれを使用できます。

<?php

class ArrayTest extends ArrayObject {
    public function invokeMethod() {
        $result = array();
        $args = func_get_args();
        $method = array_shift($args);
        foreach ($this as $obj) {
            $result[] = call_user_func_array(array($obj, $method), $args);
        }
        return $result;
    }
}

//example class to use
class a { 
    private $a;
    public function __construct($a) { 
        $this->a = $a; 
    }

    public function multiply($n) {
        return $this->a * $n;
    }
 }

//use ArrayTest instance instead of array
$array = new ArrayTest();
$array[] = new a(1);
$array[] = new a(2);
$array[] = new a(3);

print_r($array->invokeMethod('multiply', 2));

これを出力します:

Array
(
    [0] => 2
    [1] => 4
    [2] => 6
)
于 2009-05-05T14:41:02.083 に答える
0

PHP 5.3 を待っている間に、array_map の一時関数をcreate_function()作成します。

$func = create_function('$o', '$o->myMethod();');
array_map($func, $objects);
于 2009-05-05T14:59:38.870 に答える