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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с массивами и регулярными выражениями в PHP 
:(
    Опции темы
slavenk
Дата 22.12.2012, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TheAthlete
*


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

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



Здравствуйте!
Есть такой код:
Код

<?php
$test = array(
  "/path1/path2/path3/files/1/file1",
  "/path2/path2/path3/files/old/file2",
  "/path3/path2/path3/files/1/file3",
  "/path1/path2/path3/files/s1/file4",
  "/path2/path2/path3/files/1/file5",
  "/path3/path2/path3/files/old/file6",
);

echo "<pre>";
print_r($test);
echo "</pre>";

?>


Подскажите пожайлуста, как лучше/проще преобразовать данный массив в массив следующего вида
Код

<?php

$test = array(
  "/path1/path2/path3/files" => "/1/file1",
  "/path2/path2/path3/files" => "/old/file2",
  "/path3/path2/path3/files" => "/1/file3",
  "/path1/path2/path3/files" => "/s1/file4",
  "/path2/path2/path3/files" => "/1/file5",
  "/path3/path2/path3/files" => "/old/file6",
);


?>


Застопорился на регулярках:

Например, если писать так (пример для одной строки массива), то на экран выдается "левое совпадение => правое совпадение". А вот как это дело записать в массив не пойму.

Код

$string       = "/path1/path2/path3/files/1/file1";
$pattern      = "#(/path\d/path2/path3/files)(.*?)#i";
$replacement  = "$1 => $2";
echo preg_replace($pattern, $replacement, $string);

PM MAIL ICQ Skype   Вверх
Arantir
Дата 22.12.2012, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

Репутация: 16
Всего: 55



Можете ответить сами себе на вопрос, почему вы не находили совпадения через preg_match, а решили превратить все это в строку через preg_replace?
Код

$str = "/path1/path2/path3/files/1/file1";
preg_match("/(\/path\d\/path\d\/path\d\/files)(.*)/i", $str, $matches);
var_dump($matches);
Код

array(3) {
  [0]=>
  string(32) "/path1/path2/path3/files/1/file1"
  [1]=>
  string(24) "/path1/path2/path3/files"
  [2]=>
  string(8) "/1/file1"
}
Код

$some_arr = array( $matches[1] => $matches[2] );



--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
slavenk
Дата 23.12.2012, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TheAthlete
*


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

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



Просто немного запутался - в основном программирую на Perl. На Perl все более понятно (IMHO)

Код

use Modern::Perl;
use utf8;

my $str = "/path1/path2/path3/files/1/file1";

my %hash = ($str =~ m<(path\d/path2/path3/files)(.*)>);

while (my ($k, $v) = each %hash) {
  say "$k => $v";
}


Теперь буду знать, что preg_match - это то же, что и оператор m// в Perl
PM MAIL ICQ Skype   Вверх
slavenk
Дата 23.12.2012, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TheAthlete
*


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

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



Теперь не могу получить ассоциативный массив. Делаю следующим образом:

Код

$test_files;
foreach ($test as $str) {
  $pattern      = "#(/path\d/path2/path3/files)(.*)#i";
  preg_match($pattern, $str, $files);
  //echo "<p>".$files[1]." => ".$files[2]."</p>";
  $test_files[$files[1]] = $files[2];
  //echo "<p>".$test_files[$files[1]]."</p>";
}

echo "<pre>";
print_r($test_files);
echo "</pre>";


В результате выводит 

Код

Array
(
    [/path1/path2/path3/files] => /s1/file4
    [/path2/path2/path3/files] => /1/file5
    [/path3/path2/path3/files] => /old/file6
)


Не понятно, куда деваются остальные значения?
PM MAIL ICQ Skype   Вверх
ksnk
Дата 23.12.2012, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(slavenk @  23.12.2012,  10:53 Найти цитируемый пост)
Не понятно, куда деваются остальные значения? 

Что такое ассоциативный массив известно?
Что будет, если пара ключей одинаковы?
Цитата

 "/path3/path2/path3/files" => "/1/file3",
 "/path3/path2/path3/files" => "/old/file6",


Это сообщение отредактировал(а) ksnk - 23.12.2012, 11:32


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
slavenk
Дата 23.12.2012, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TheAthlete
*


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

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



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


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

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