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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Array + string: xитрая задачка для любителей 
:(
    Опции темы
maxipub
Дата 4.3.2010, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 1



Собственно, решить не проблема. Хотелось бы сделать это элегантно и грамотно.

Имеется:

Код

$s1 = 'qwer';
$a1 = array('Нулевой', 'Первый', 'Второй', 'Третий');// все значения уникальны
$a2 = array('Нулевой' => 'a', 'Третий' => 'd');


На выходе необходимо получить:

Код

$s2 = 'awed';


В строке $s1 необходимо заменить те элементы с соответствующим индексом $a1, для которых в самом $a1 имеются индексы в $a2 с соответствующими им значениями.

Может сумбурно описал, но суть, думаю, ясна из кода.

Ну что, профи, какие будут варианты?

Добавлено через 13 минут и 9 секунд
Гы, как это часто бывает, только запостил, как тут же придумал весьма достойное решение. smile 

Но будет интересно взглянуть и на ваши варианты.
PM MAIL   Вверх
IZ@TOP
Дата 4.3.2010, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Накидал от нечего делать

Код

<?php

$sr = '';
$st = 'Hello';
$kp = array('zero', 'one', 'two', 'three', 'four');
$kv = array('zero' => 'Y', 'four' => 's');

array_walk($kp, function ($v, $k, $a) { if(array_key_exists($v,$a[0])) { $a[2] .= $a[0][$v]; } else { $a[2] .= substr($a[1],$k,1); }}, array($kv, $st, &$sr));
echo $sr;




--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
maxipub
  Дата 4.3.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 1



IZ@TOP, ух ты, здорово! smile Конечно, чуть голову не свернул, пока разбирал как оно работает smile 
Хорошее техническое решение. А я пошел тривиальным логическим путем. Будут еще варианты, пишите, интересно посмотреть. smile 
PM MAIL   Вверх
IZ@TOP
Дата 4.3.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



В личку скинь, что нарешал.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
maxipub
Дата 4.3.2010, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 1



IZ@TOP, да там секретов нет smile просто в коде проекта был, вот переписал чтоб под условия подошел, там просто вспомогательный массив вводится (типа логика smile)

Код

$a3 = array();
foreach ($a1 as $name => $val)
    $a3[$val] = $name;

foreach ($a2 as $name => $val)
    if (isset($a3[$name]))
        $s1[$a3[$name]] = $val;

echo $s1;

PM MAIL   Вверх
IZ@TOP
Дата 4.3.2010, 18:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



maxipub, открою секрет, в моем варианте не обязательно заменять символы один к одному, можно символы на строки. Если в этом нет необходимости, код можно еще сократить.
Вариант с foreach в лоб самый простой. В принципе, его и стоит использовать, если конечно, не хочешь, что бы у кого-то от твоего решения мозги загнулись XD


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
maxipub
Дата 4.3.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 1



Цитата(IZ@TOP @  4.3.2010,  18:23 Найти цитируемый пост)
в моем варианте не обязательно заменять символы один к одному, можно символы на строки

Эээ.. я что-то не догнал, о чем именно речь? smile

Добавлено через 2 минуты и 27 секунд
Типа сделать $sr = $st; и убрать else { $a[2] .= substr($a[1],$k,1); }
?
PM MAIL   Вверх
IZ@TOP
Дата 5.3.2010, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Код

array_walk($kp, function ($v, $k, $a) { if(array_key_exists($v,$a[0])) { $a[1]{$k} = $a[0][$v]; }}, array($kv, &$st));

Как-то так.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
solenko
Дата 5.3.2010, 13:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 34
Всего: 67



Вспомнил эту тему и получил такое вот решение:
Код

<?php
$s1 = 'qwer';
$a1 = array('One', 'Two', 'Three', 'Four');
$a2 = array('One' => 'a', 'Three' => 'd');
join('', array_values(array_merge(array_combine($a1, str_split($s1)), $a2)));



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
maxipub
Дата 5.3.2010, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 1



solenko, вау, классное решение smile 

Единственное что, ребята, сорри, я как-то совсем упустил из виду тот факт, что количество элементов массива $a1 и количество символов в строке $s1 не обязательно будут равными. Разумеется, если они не равны (sizeof($a1) < strlen($s1)), то представленные варианты в таком виде не работают (кроме моего "дедовского", разумеется smile ).
PM MAIL   Вверх
solenko
Дата 5.3.2010, 16:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 34
Всего: 67



Цитата(maxipub @  5.3.2010,  14:18 Найти цитируемый пост)
Единственное что, ребята, сорри, я как-то совсем упустил из виду тот факт, что количество элементов массива $a1 и количество символов в строке $s1 не обязательно будут равными. Разумеется, если они не равны (sizeof($a1) < strlen($s1)), то представленные варианты в таком виде не работают (кроме моего "дедовского", разумеется  ). 

Вы хотите меня поставить в тупик вашими вопросами? Так я вас поставлю в тупик своими ответами! (с) Жванецкий
Код

<?php
$s1 = 'qert';
$a1 = array('One', 'Two', 'Three', 'Four');
$a2 = array('One' => 'a', 'Three' => 'd');
echo substr(trim(join('', array_values(array_merge(array_combine(array_pad($a1, strlen($s1), false), str_split(str_pad($s1, count($a1)))), $a2)))), 0, strlen($s1));

$s1 = 'qerty';
$a1 = array('One', 'Two', 'Three', 'Four');
$a2 = array('One' => 'a', 'Three' => 'd');
echo substr(trim(join('', array_values(array_merge(array_combine(array_pad($a1, strlen($s1), false), str_split(str_pad($s1, count($a1)))), $a2)))), 0, strlen($s1));

$s1 = 'qe';
$a1 = array('One', 'Two', 'Three', 'Four');
$a2 = array('One' => 'a', 'Three' => 'd');
echo substr(trim(join('', array_values(array_merge(array_combine(array_pad($a1, strlen($s1), false), str_split(str_pad($s1, count($a1)))), $a2)))), 0, strlen($s1));




Добавлено через 45 секунд
// Не рекомендуется повторять в домашних условиях  smile 


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
maxipub
  Дата 5.3.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 1



solenko, о-о-о smile это надо будет на выходных взять пивасика и сесть разобраться smile боюсь повредить себе моск в рабочее время smile 
 smile  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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