Как найти определенный символ для создания массива из строки, используя php - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть строка, подобная приведенной ниже:

'STRIPLED 9.6W 24V 2.7K 120LED IP20 1CM',
'STRIPLED 9.6W 24V 3K 120LED IP20 1CM',
'STRIPLED H 6 W 24V 4K 140 LED IP20 1CM',
'STRIPLED HO 12.3 W 24V 3K 128 LED IP65 1CM',
'STRIPLED HO 20W 24V 2.7K 280 LED IP65 1CM',
'STRIPLED 14.4W 24V 2.7K 180 LED IP65 1 CM',

Я пытался найти какой-нибудь символ и создать массив, например

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

Array
(
    [0] => Array
        (
            [power] => 9.6W 24V
            [temp] => 2.7
            [degrees] => IP20
        )

    [1] => Array
        (
            [power] => 9.6W 24V
            [temp] => 3
            [degrees] => IP20
        )
    [2] => Array
        (
            [power] => HO 12.3 W 24V
            [temp] => 3
            [degrees] => IP65
        )
)

но яне может прийти к правильному решению.

Объясните: STRIPLED 9,6 Вт 24 В 2,7 К 120LED IP20 1 СМ

Здесь W & V означает мощность, K означает Temp, IP означает степень


Мой проверенный код:

<?php 
$descriptions = [
    'STRIPLED 9.6W 24V 2.7K 120LED IP20 1CM',
    'STRIPLED 9.6W 24V 3K 120LED IP20 1CM',
    'STRIPLED H 6 W 24V 4K 140 LED IP20 1CM',
    'STRIPLED HO 12.3 W 24V 3K 128 LED IP65 1CM',
    'STRIPLED HO 20W 24V 2.7K 280 LED IP65 1CM',
    'STRIPLED 14.4W 24V 2.7K 180 LED IP65 1 CM',
]; 

$desc = [];
foreach($descriptions as $key=>$val){
    $desc[$key]['power'] = strstr($val, 'V', true);
    $desc[$key]['temp'] = strstr($val, 'K', true);
    $desc[$key]['degrees'] = strstr($val, 'IP', true);
}

echo "<pre>";
print_r($desc).exit;
?>

Я вижу вывод такой:

Array
(
    [0] => Array
        (
            [power] => STRIPLED 9,6W 24
            [temp] => STRIPLED 9,6W 24V 2,7
            [degrees] => STR
        )

    [1] => Array
        (
            [power] => STRIPLED 9,6W 24
            [temp] => STRIPLED 9,6W 24V 3
            [degrees] => STR
        )

    [2] => Array
        (
            [power] => STRIPLED H 6 W 24
            [temp] => STRIPLED H 6 W 24V 4
            [degrees] => STR
        )

    [3] => Array
        (
            [power] => STRIPLED HO 12,3 W 24
            [temp] => STRIPLED HO 12,3 W 24V 3
            [degrees] => STR
        )

    [4] => Array
        (
            [power] => STRIPLED HO 20W 24
            [temp] => STRIPLED HO 20W 24V 2,7
            [degrees] => STR
        )

    [5] => Array
        (
            [power] => STRIPLED 14,4W 24
            [temp] => STRIPLED 14,4W 24V 2,7
            [degrees] => STR
        )

)

Может кто-нибудь дать мне решение для создания ожидаемого результата.

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вы также можете попробовать это:

<code><?php
$arrays = [
    'STRIPLED 9.6W 24V 2.7K 120LED IP20 1CM',
    'STRIPLED 9.6W 24V 3K 120LED IP20 1CM',
    'STRIPLED H 6 W 24V 4K 140 LED IP20 1CM',
    'STRIPLED HO 12.3 W 24V 3K 128 LED IP65 1CM',
    'STRIPLED HO 20W 24V 2.7K 280 LED IP65 1CM',
    'STRIPLED 14.4W 24V 2.7K 180 LED IP65 1 CM'
];

foreach ($arrays as $array){
    //remove STRIPLED
    $result = [];
    $removedStripled = str_replace('STRIPLED ', "", $array);
    $arr = strtok($removedStripled, 'V');
    $result['power'] = $arr.'V';
    $temp = str_replace($arr.'V', "", $removedStripled);
    $arr = strtok($temp, 'K');
    $result['temp'] = $arr;
    preg_match("/IP.*[0-9\s]/", $removedStripled, $match);
    $degrees = explode(' ', $match[0]);
    $result['degress'] = $degrees[0];

    echo "<pre>";
    print_r($result);
    echo "
";}
0 голосов
/ 23 ноября 2018

Я думаю, что использование preg_match, вероятно, самый простой способ извлечь нужные данные.Исходя из ваших примеров данных, это регулярное выражение должно работать:

^\w+\s+([^V]+V)\s+([\d.,]+)K.*?(IP\d+)

Это ищет слово, за которым следует некоторое количество не V символов (компонент "power"), затем число перед K (компонент «температура») и, наконец, строка, соответствующая IP, за которой следует некоторое количество цифр (компонент «градус»).Вы можете использовать этот код (используя array_map) для обработки массива):

$descriptions = [
    'STRIPLED 9.6W 24V 2.7K 120LED IP20 1CM',
    'STRIPLED 9.6W 24V 3K 120LED IP20 1CM',
    'STRIPLED H 6 W 24V 4K 140 LED IP20 1CM',
    'STRIPLED HO 12.3 W 24V 3K 128 LED IP65 1CM',
    'STRIPLED HO 20W 24V 2.7K 280 LED IP65 1CM',
    'STRIPLED 14.4W 24V 2.7K 180 LED IP65 1 CM',
]; 
$desc = array_map(function ($v) { 
            preg_match('/^\w+\s+([^V]+V)\s+([\d.,]+)K.*?(IP\d+)/', $v, $m);
            array_shift($m); 
            return $m; }, $descriptions);
print_r($desc);

Выходные данные для ваших образцов данных:

Array
(
    [0] => Array
        (
            [0] => 9.6W 24V
            [1] => 2.7
            [2] => IP20
        )    
    [1] => Array
        (
            [0] => 9.6W 24V
            [1] => 3
            [2] => IP20
        )    
    [2] => Array
        (
            [0] => H 6 W 24V
            [1] => 4
            [2] => IP20
        )    
    [3] => Array
        (
            [0] => HO 12.3 W 24V
            [1] => 3
            [2] => IP65
        )    
    [4] => Array
        (
            [0] => HO 20W 24V
            [1] => 2.7
            [2] => IP65
        )    
    [5] => Array
        (
            [0] => 14.4W 24V
            [1] => 2.7
            [2] => IP65
        )    
)

Демо на 3v4l.org

...