Конвертировать строку в массив PHP - PullRequest
3 голосов
/ 23 июля 2011

Некоторое время назад я получал много данных через какой-то API и сохранял их в плоский файл, используя простой var_dump или print_r.Теперь я ищу для обработки данных, и каждая строка выглядит следующим образом:

"'middle_initial' => '', 'sid' => '1419843', 'fixed' => 'Y''cart_weight' => '0', 'key' => 'ABCD', 'state' => 'XX', 'last_name' => 'MNOP', 'email' => 'abc@example.com', 'city ​​'=>' London ',' street_address '=>' Sample ',' first_name '=>' Sparsh ', "

Теперь мне нужно вернуть эти данные обратно в формат массива.Есть ли способ, которым я могу это сделать?

Ответы [ 4 ]

6 голосов
/ 23 июля 2011

Как насчет того, чтобы сначала взорвать строку с помощью функции explode(), используя ', ' в качестве разделителя:

$str = "'middle_initial' => '', 'sid' => '1419843', 'fixed' => 'Y', 'cart_weight' => '0', 'key' => 'ABCD', 'state' => 'XX', 'last_name' => 'MNOP', 'email' => 'abc@example.com', 'city' => 'London', 'street_address' => 'Sample', 'first_name' => 'Sparsh',";
$items = explode(', ', $str);
var_dump($items);

Что даст вам массив, похожий на этот:

array
  0 => string ''middle_initial' => ''' (length=22)
  1 => string ''sid' => '1419843'' (length=18)
  2 => string ''fixed' => 'Y'' (length=14)
  3 => string ''cart_weight' => '0'' (length=20)
  ...


И затем выполните итерацию по этому списку, сопоставляя для каждого элемента каждую сторону => и используя первую сторону => в качестве ключа ваших результирующих данных, ивторое в качестве значения:

$result = array();
foreach ($items as $item) {
    if (preg_match("/'(.*?)' => '(.*?)'/", $item, $matches)) {
        $result[ $matches[1] ] = $matches[2];
    }
}
var_dump($result);

Что даст вам:

array
  'middle_initial' => string '' (length=0)
  'sid' => string '1419843' (length=7)
  'fixed' => string 'Y' (length=1)
  'cart_weight' => string '0' (length=1)
  ...


Но, если серьезно, вы не должны хранить данные в таком ужасном формате: print_r()предназначен для отображения данных, в целях отладки, а не для сохранения их, а затем повторно загрузите их!

Если вы хотите сохранить данные в текстовом файле, используйте serialize() илиjson_encode(), которые можно восстановить с помощью unserialize() или json_decode() соответственно.

1 голос
/ 23 июля 2011

Хотя я искренне согласен с Паскалем Мартином, если у вас есть такие данные, следующие (как упоминалось в первом предложении Паскаля) могут работать в зависимости от вашего фактического содержания.Однако сделайте себе одолжение и храните свои данные в формате, который можно надежно вернуть обратно в массив PHP (сериализация, JSON, CSV и т. Д.).

<code><pre>
<?php

$str = "\" 'middle_initial' => '', 'sid' => '1419843', 'fixed' => 'Y', 'cart_weight' => '0', 'key' => 'ABCD', 'state' => 'XX', 'last_name' => 'MNOP', 'email' => 'abc@example.com', 'city' => 'London', 'street_address' => 'Sample', 'first_name' => 'Sparsh',\"";

function myStringToArray($str) {
    $str = substr($str, 1, strlen(substr($str, 0, strlen($str)-2)));
    $str = str_replace("'",'',$str);
    $strs = explode(',', $str);
    $arr = array();
    $c_strs = count($strs);
    for ($i = 0; $i < $c_strs; $i++) {
        if (strpos($strs[$i],'=>') !== false) {
            $_arr = explode('=>',$strs[$i]);
            $arr[trim($_arr[0])] = trim($_arr[1]);
        }
    }
    return $arr;
}

print_r(myStringToArray($str));

?>

http://jfcoder.com/test/substr.php

Обратите внимание, что вам нужно настроить функцию, если у вас есть запятые в содержимом вашего элемента массива (например, с использованием предложения Паскаля о токене ', ').

0 голосов
/ 23 июля 2011

Пока это вывод print_r и массив, вы можете использовать мой маленький print_r конвертер , исходный код PHP доступен по ссылке.

Токенайзер основан на регулярных выражениях, поэтому вы можете использовать его для своих нужд. Парсер имеет дело с формированием значения массива PHP.

Вы найдете последнюю версию ссылки на странице моего профиля.

0 голосов
/ 23 июля 2011

Было бы лучше и намного проще работать с Сериализация и Несериализация вместо var_dump.

в этой форме, может быть, вы могли бы попробовать

explode(' => ', $string)

, а затем просмотрите массив и соедините пары в новый массив.

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