public function __call($method, $arguments) { // 自動的に引数位置を変更するメソッド if (!$this->arg_push && in_array($method, self::$auto_push_method)) { $this->p(); } // 値が空の場合 if (empty($this->value)) { return $this; } // 値がスカラー値の場合でも動くように if (is_scalar($this->value)) { $arg = $arguments; if ($this->arg_push) { $arg[] = $this->value; } else { array_unshift($arg, $this->value); } $this->value = call_user_func_array($method, $arg); $this->arg_push = false; $this->is_call = false; return $this; } // 再帰を含めた要素処理 foreach ($this->value as $k => $v) { $arg = $arguments; if (is_array($v)) { $arr = new ArrayMap($v); if ($this->arg_push) { $arr->p(); } if ($this->is_call) { array_unshift($arg, $method); call_user_func_array(array($arr, 'call'), $arg); } else { call_user_func_array(array($arr, $method), $arguments); } $this->value[$k] = $arr->v(); continue; } if ($this->arg_push) { $arg[] = $v; } else { array_unshift($arg, $v); } $this->value[$k] = call_user_func_array($method, $arg); } $this->arg_push = false; $this->is_call = false; return $this; }