Создать многомерный массив из строки с разделителем

Boris

Новичок
Здравствуйте!
Подскажите как создать многомерный массив из строки типа:
s_operator1;имя_оператора_001;100:::s_operator2;имя_оператора_002;43:::s_operator3;имя_оператора_003;50:::.........s_operatorN;имя_оператора_00N;98:::

чтобы было так
array_operators[0][0] ---- s_operator1
array_operators[0][1] ---- имя_оператора_001
array_operators[0][2] ---- 100
.
.
.
array_operators[N][0] ---- s_operatorN
array_operators[N][1] ---- имя_оператора_00N
array_operators[N][2] ---- 100
 

Boris

Новичок
Да конечно знаю с помощью раз делителя ::: получаю массив. но никак не пойму как разделить еще и по ;
 

keltanas

marty cats
Так подойдет?
PHP:
<?php
$str = 's_operator1;имя_оператора_001;100:::s_operator2;имя_оператора_002;43';
$result = array_map(function($val) {
    return explode(';', $val);
}, explode(':::', $str));
var_dump($result);
или в 1 строку))

PHP:
$result = array_map(create_function('$v', 'return explode(";", $v);'), explode(':::', $str)); // PHP <=5.2
 

radioheaded

PHP нуб
Это будет правильное решение? Или есть способ одним разом создать массив?
Правильное решение — это которое дает правильный результат. Что такое «одним разом создать массив» я не знаю, к сожалению.
 

Вурдалак

Продвинутый новичок
keltanas, почему для решения в одну строку тебе понадобилось юзать мерзкую create_function?
 

radioheaded

PHP нуб
Да где ж тут в одну строку, тут аж 9 строк.
PHP:
$result = 
    array_map(
        create_function(
            '$v', 
            'return explode(";", $v);'
        ),
        explode(':::', $str)
    )
;
 

keltanas

marty cats
radioheaded Это ты где-то пару строк потерял
PHP:
$result =
    array_map(
        create_function(
            '$v',
            'return explode(";", $v);'
        ),
        explode(
            ':::',
            $str
        )
    )
;
Вурдалак
Я люблю разнообразие :p
Хотя тут как не крути, а функциональщина на php в любом виде выглядит мерзко...
 

hell0w0rd

Продвинутый новичок
PHP:
function arrayExplode(array $dels, $str)
{
    if(!empty($dels)) {
        $del = array_shift($dels);
        if(!is_array($str)) {
            $str = explode($del, $str);
        } else {
            $temp = $str;
            $str = array();
            foreach ($temp as $str_t) {
                $str = array_merge($str, explode($del, $str_t));
            }
        }
        return arrayExplode($dels, $str);
    } else {
        return $str;
    }
}

var_dump(arrayExplode(array(':::', ';'), 's_operator1;имя_оператора_001:::100:::s_operator2;имя_оператора_002:::43'));
 

hell0w0rd

Продвинутый новичок
Вурдалак
и чего не так?
PHP:
$temp = array();
foreach ($str as $str_t) {
    $temp = array_merge($temp, explode($del, $str_t));
}
$str = $temp;
можно и так.. разницы особо нет)
 

hell0w0rd

Продвинутый новичок
PHP:
function arrayExplode(array $dels, $input)
{
    $input = (array)$input;
    if(!empty($dels)) {
        $del = array_shift($dels);
        $result = array();
        foreach ($input as $str) {
            $result = array_merge($result, explode($del, $str));
        }
        return arrayExplode($dels, $result);
    } else {
        return $input;
    }
}
Ок:)
keltanas
А что плохого в том, чтобы пользоваться динамической типизацией?)
 
Сверху