Преобразовать строку в массив через пробел

1

У меня ниже строки образца

device_name="Text Data" d_id=7454579598 status="Active" Key=947-4378-43248274

Я хочу преобразовать эту строку в массив

Ожидаемый результат

device_name="Text Data"
d_id=7454579598
status="Active" 
Key=947-4378-43248274

Я попробовал это, используя функцию explode для этого, но он дает ниже выходного

$data='device_name="Text Data" d_id=7454579598 status="Active" Key=947-4378-43248274';
$arr= explode("",$data);

генерируемый результат

device_name="Text 
Data"
d_id=7454579598
status="Active" 
Key=947-4378-43248274
  • 0
    Функция Explode преобразует ваши данные в массив.
  • 0
    Да, но есть одна проблема. Используя это, это также взрывает ценность.
Показать ещё 3 комментария
Теги:
arrays

3 ответа

0
Лучший ответ

попробуйте этот код

    $str = 'device_name="Text Data" d_id=7454579598 status="Active" Key=947-4378-43248274';
$pattern = '/(\\w+)\s*=\\s*("[^"]*"|\'[^\']*\'|[^"\'\\s>]*)/';
preg_match_all($pattern, $str, $matches, PREG_SET_ORDER);

$attrs = array();
foreach ($matches as $match) {
    if (($match[2][0] == '"' || $match[2][0] == "'") && $match[2][0] == $match[2][strlen($match[2])-1]) {
        $match[2] = substr($match[2], 1, -1);
    }
    $name = strtolower($match[1]);
    $value = html_entity_decode($match[2]);
    $attrs[$name] = $value;
}
print_r($attrs);

вывод

Array ( [device_name] => Text Data [d_id] => 7454579598 [status] => Active [key] => 947-4378-43248274 ) 
0

Сначала конвертируйте в JSON. JSON Docs

$str = 'device_name="Text Data" d_id=7454579598 status="Active" Key=947-4378-43248274';
$json = '{'.str_replace('=',':',$str).'}';
$json = '{'.str_replace(' ',',',$str).'}';

получить как JSON. как:

{device_name:"Text Data",d_id:7454579598,status:"Active",Key:947-4378-43248274}

и преобразовать в массив

$array = json_decode($json, true);

и выход

array(4) {
    ["device_name"] => "Text Data"
    ["d_id"] => 7454579598
    ["status"] => "Active"
    ["Key"] => "947-4378-43248274"
}
0

Рассмотрим этот небольшой и тривиальный пример, используя регулярное выражение:

<?php    
$subject = 'device_name="Text Data" d_id=7454579598 status="Active" Key=947-4378-43248274';
$pattern = '/^device_name="(.*)" d_id=(\d+) status="(.*)" Key=([0-9-]*)$/';
preg_match($pattern, $subject, $tokens);
var_dump($tokens);

Это создает этот результат:

array(5) {
  [0] =>
  string(77) "device_name="Text Data" d_id=7454579598 status="Active" Key=947-4378-43248274"
  [1] =>
  string(9) "Text Data"
  [2] =>
  string(10) "7454579598"
  [3] =>
  string(6) "Active"
  [4] =>
  string(17) "947-4378-43248274"
}

Отсюда вы, вероятно, можете продолжать :-)

  • 0
    Как это сделать динамически? Это только примерные данные.
  • 0
    ОК, вы не упомянули об этом в своем вопросе. Я предположил, что у вас есть фиксированный формат, который вы хотите обработать. Для динамического сопоставления шаблон, очевидно, становится более сложным. Посмотрите на ответ @Karan, опубликованный выше. Выглядит хорошо для меня :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню