За последние 24 часа нас посетили 22009 программистов и 1003 робота. Сейчас ищет 701 программист ...

Элемент массива как ключ для элемента другого массива

Тема в разделе "Вопросы от блондинок", создана пользователем Papa Roach, 30 май 2010.

  1. Papa Roach

    Papa Roach Активный пользователь

    С нами с:
    30 май 2010
    Сообщения:
    4
    Симпатии:
    0
    Здравствуйте товарищи. Возник архисложный вопрос, который никак мной нерешается.
    Безуспешно стучать в бубен уже нет сил.
    Поможите товарищу.

    Вопрос такой.

    Имеется строка

    PHP:
    1. $str = 'Уважаемый {name}, ну и имя у вас!';
    Имеется База данных. Не стану расписывать запросы и т.п. На выходе получаю массив примерно следующий

    PHP:
    1. $arr = ('name'=>'Муштандроид', 'age'=>30);
    Так вот, задача в том, чтобы заменить вот это в строке {name} на соответствующее имя по ключу из массива.
    Т.е. выражение в фигурных скобках должно идентифицировать ключ массива и выводить его значение.

    Я написал следующий код

    PHP:
    1. $str = preg_replace ("/\{(.*)\}/U", $arr["$1"], $str);
    Не сработало. Перебирая всевозможные варианты перестановки кавычек, совсем отчаялся и написал следующее:

    PHP:
    1. $str = preg_replace_callback ("/\{(.*)\}/U", create_function('$matches', return $arr[$matches[1]];'), $str);
    Но и это возвращает пустой результат, хотя если убрать $arr вот так

    PHP:
    1. $str = preg_replace_callback ("/\{(.*)\}/U", create_function('$matches', return $matches[1];'), $str);
    То код исправно выводит содержание между фигурными скобками.
    Может у меня в синтаксисе что-то не так... подскажите пожалуйста, как мне это реализовать?
    Заранее спасибо.
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Мазафака =))
    Скорей архидетский =)

    PHP:
    1. <?php
    2.  
    3. $str = 'Уважаемый {name}, ну и имя у вас!';
    4. $replacements = ('name'=>'Муштандроид', 'age'=>30);
    5.  
    6. // Замена
    7. $str = str_replace(array_keys($replacements), $replacements, $str);
    8.  
    9. ?>
    Усё
     
  3. Papa Roach

    Papa Roach Активный пользователь

    С нами с:
    30 май 2010
    Сообщения:
    4
    Симпатии:
    0
    Уважаемый {Мутандроид}, ну и имя у вас!

    Мне нужен поиск именно по маске, потому что они гораздо более сложные, с кучей переменных на выходе.

    Я это написал примитивный пример для того чтобы понять как имея переменную $1 из результата работы маски использовать в качестве ключа для массива.
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Я не заметил или вы об этом не написали? =))

    Возможен точно такой же перебор.
    Делается маска и вхождение, обработанное preg_quote.
    В цикле идет перебор.
    Хотя реальной задачи я не вижу, но подход такой.
     
  5. Papa Roach

    Papa Roach Активный пользователь

    С нами с:
    30 май 2010
    Сообщения:
    4
    Симпатии:
    0
    Есть конечно вариант такой например

    PHP:
    1. $str = preg_replace_callback ("/\{(.*)\}/U", "get_value", $str);
    2.  
    3. function get_value($v) {
    4. global $arr;
    5. return $arr[$v];
    6. }
    И он в принципе работает. Но мне почему-то кажется, что это жуткий онанизм. Использовать целую функцию, чтобы выдрать одно значение из массива.
    Хочется чтобы коротко, ясно, резко и неожиданно как понос.

    Да и циклы хотелось бы оставить на крайний случай
     
  6. Papa Roach

    Papa Roach Активный пользователь

    С нами с:
    30 май 2010
    Сообщения:
    4
    Симпатии:
    0
    Ура товарищи! Проблема решилась наконец-то!

    PHP:
    1. $str = preg_replace_callback ("/\{(.*)\}/U", create_function( '$matches', 'global $arr; return $arr[$matches[1]];'), $str);
    И всего одна строчка!