Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > работа с массивами и регулярными выражениями в PHP


Автор: slavenk 22.12.2012, 22:54
Здравствуйте!
Есть такой код:
Код

<?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);

Автор: Arantir 22.12.2012, 23:30
Можете ответить сами себе на вопрос, почему вы не находили совпадения через 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] );

Автор: slavenk 23.12.2012, 10:05
Просто немного запутался - в основном программирую на 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

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

Код

$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
)


Не понятно, куда деваются остальные значения?

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

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

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

Автор: slavenk 23.12.2012, 13:32
Спасибо! Понял свою ошибку! Все работает!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)