Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> array_walk, array_map ... Метод класса в качестве callback-функции 
:(
    Опции темы
skalex
Дата 31.5.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: 8
Всего: 23



Как указать в качестве callback-функции метод класса для функций типа array_walk, array_map ?
Иллюстрирующий пример:
Код
<?php

class Tools {
   function Perform(&$data, $k) {
      $data['name'] = 'Name: '.$data['name'];
      return $data['name'];
   }
}

function Perform(&$data, $k) {
   $data['name'] = 'Name: '.$data['name'];
   return $data['name'];
}

$data = array(
   array(
      'name' => 'name 1',
   ),
   array(
      'name' => 'name 2',
   )
);

echo '<pre>';

// Не работает
array_walk($data, 'Tools::Perform');
print_r($data);


// Работает
array_walk($data, 'Perform');
print_r($data);

?>


PM   Вверх
Mal Hack
Дата 31.5.2005, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Код
array_walk($input, array($this, method) );

Код
call_user_func_array(),

PM ICQ   Вверх
skalex
Дата 31.5.2005, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: 8
Всего: 23



Mal Hack, благодарю! smile
PM   Вверх
Bikutoru
Дата 1.6.2005, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



А можно как-нибудь использовать с array_walk функцию, у которой несколько аргументов и некоторые не зависят от текущего элемента массива? Можно, конечно, написать функцию-обертку, но может есть другой способ, "встроенный"?


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
skalex
Дата 1.6.2005, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: 8
Всего: 23



Код
bool array_walk ( array &array, callback funcname [, mixed userdata] )

Bikutoru, userdata - это не то, что Вам нужно ?
PM   Вверх
Bikutoru
Дата 1.6.2005, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Я так понимаю, что userdata - это один дополнительный параметер, а мне хотелось бы несколько независимых параметров, причем упаковывать их в один массив как-то не хочется...


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 1.6.2005, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Через call_user_func_array() тогда надо делать.
PM ICQ   Вверх
Bikutoru
Дата 2.6.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



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


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 2.6.2005, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Bikutoru а то мешает сделать что-то типа:
Код
array_walk($input, array($this, method),array('one','two','three'));

PM ICQ   Вверх
Bikutoru
Дата 3.6.2005, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Mal Hack, увы не прокатывает...
Код

function f($a1, $a2, $a3, $a4)
{
    echo "a1 - $a1<BR>a2 - $a2<BR>a3 - $a3<BR>a4 - $a4<BR><BR><BR>";
}

$args1 = array(1, 2, 3);

array_walk($args1, "f", array(7, 8));

Дело в том, что та функция используется и без array_walk, так что ее изменять нельзя. Придется писать обертку...


Это сообщение отредактировал(а) Bikutoru - 3.6.2005, 18:09


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 3.6.2005, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Цитата(Bikutoru @ 3.6.2005, 19:03)

Дело в том, что та функция используется и без array_walk, так что ее изменять нельзя. Придется писать обертку...

Это ошибка проектирования... Не должно так получаться.

Bikutoru сразу надо было говорить все свои ограничения.
PM ICQ   Вверх
Bikutoru
Дата 4.6.2005, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Цитата
Это ошибка проектирования... Не должно так получаться.

Совсем не обязательно. Если использовать не array_walk, а
Код

for(...)
     f(...);

то никаких проблем не будет...


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0883 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.