php - карта массива с использованием публичной функции обратного вызова в классе - PullRequest
4 голосов
/ 22 января 2011
class something{   
    public function add_val( $val ){
    $array = array();
    foreach( $val as $value ) {
        $array[] = static::$post[${$value}];
    }
    return $array;
    }
    pulblic function somethingelse(){
       .... 
       ....
       $optionsArray['value'] = array_map( 'add_val', array_chunk( $drop_val, count( $optionsArray['heading_x'] ) ) );
       ....
       ....
    }
}

как я могу вызвать метод add_val внутри другого, используя array_map () ??

1 Ответ

8 голосов
/ 22 января 2011

Используйте массив, содержащий объект и имя метода:

$optionsArray['value'] = array_map(array($this, 'add_val'), array_chunk($drop_val, count($optionsArray['heading_x'])));

Вы делаете то же самое для большинства других функций, которые принимают обратные вызовы в качестве параметров, например array_walk(), call_user_func(), call_user_func_array() и т. Д.

Как это работает? Что ж, если вы передаете массив в параметр обратного вызова, PHP делает что-то похожее на это (для array_map()):

if (is_array($callback)) {         // array($this, 'add_val')
    if (is_object($callback[0])) {
        $object = $callback[0];    // The object ($this)
        $method = $callback[1];    // The object method name ('add_val')

        foreach ($array as &$v) {
            // This is how you call a variable object method in PHP
            // You end up doing something like $this->add_val($v);
            $v = $object->$method($v);
        }
    }
}

// ...

return $array;

Здесь вы можете видеть, что PHP просто перебирает ваш массив, вызывая метод для каждого значения. Ничего сложного в этом нет; опять просто базовый объектно-ориентированный код.

Это может быть, а может и не быть так, как это делает PHP внутри, но концептуально это то же самое.

...