Разбил строку в переменную с переменной позицией - PullRequest
1 голос
/ 26 марта 2020

Мне нужно разбить строку на несколько переменных, но ее порядок не установлен в качестве примера:

$string = "name='John';phone='555-5555';city='oakland';";
$string2 = "city='oakland';phone='555-5555';name='John';";
$string3 = "phone='555-5555';name='John';city='oakland';";

, поэтому мне нужно разбить строки на:

$name
$phone
$city

, если позиция была бы фиксированной, я мог бы использовать разнесение и вызвать ключ массива, который мне нужен, например

$brokenString = explode("'",$string);

$name = $brokenString[1];
$phone = $brokenString[3];
$city = $brokenString[5];

однако как я могу сделать это с переменной позицией ??

Ответы [ 3 ]

2 голосов
/ 26 марта 2020

Один из способов сделать это с помощью sort , чтобы сделать положение всегда одинаковым для всех строковых переменных.

<?php
$string = "name='John';phone='555-5555';city='oakland';";
$string2 = "city='oakland';phone='555-5555';name='John';";
$string3 = "phone='555-5555';name='John';city='oakland';";
$array = explode(';',$string3);
sort($array);
$array = array_filter($array); # remove the empty element
foreach($array as $value){
    $split = explode('=',$value);
    $result[$split[0]] = $split[1]; 
}
extract($result); # extract result as php variables
echo "\$city = $city; \$name = $name; \$phone = $phone";
?>

EDIT: Так как extract() как правило, не очень хорошая идея. Вы можете использовать простые foreach() вместо extract(),

foreach($result as $k => $v) {
  $$k = $v;
}

РАБОЧИЙ ДЕМО: https://3v4l.org/RB8pT

1 голос
/ 26 марта 2020

Альтернативный способ - преобразовать его во что-то, что можно проанализировать как строку URL.

Первая часть - изменить значения и с 'John', до John& с помощью регулярного выражения ('([^']+)'; который ищет ' до ', за которым следует ;), а затем анализирует результат (используя parse_str()) ...

$string = "name='John';phone='555-5555';city='oakland';";
$string = preg_replace("/'([^']+)';/","$1&", $string);
echo $string.PHP_EOL;

parse_str( $string, $values );

print_r($values);

дает вывод

name=John&phone=555-5555&city=oakland&
Array
(
    [name] => John
    [phone] => 555-5555
    [city] => oakland
)

или просто с помощью регулярных выражений ...

preg_match_all("/(\w*)?='([^']+)';/", $string, $matches);

print_r(array_combine($matches[1], $matches[2]));
1 голос
/ 26 марта 2020

Возможно, существует более простой метод, но я создал массив $stringVariables, который содержит разнесенные строки.

Этот массив затем проходит по циклу, и strpos используется в каждом элементе массива разнесенных строк, чтобы увидеть, содержит ли он 'city', 'phone' или 'name'. В зависимости от того, какой из них, он добавляется в массив, который содержит все имена, города или номера телефонов.

$stringVariables = array();
$phones = array();
$names = array();
$cities = array();
$stringVariables[] = explode(";",$string);
$stringVariables[] = explode(";",$string2);
$stringVariables[] = explode(";",$string3);
foreach($stringVariables as $stringVariable) {
   foreach($stringVariable as $partOfString) {
      if(strpos($partOfString, "name=") !== false) {
         $names[] = $partOfString;
      }else if(strpos($partOfString, "city=") !== false) {
         $cities[] = $partOfString;
      }else if(strpos($partOfString, "phone=") !== false) {
         $phones[] = $partOfString;
      }
   }
}
...