Разбить строку на ассоциативный массив без использования циклов?

215
19

У меня есть строка, например, 1-350,9-390.99,..., и мне нужно превратить ее в ассоциативный массив следующим образом:

 Array
(
[1] => 350
[9] => 390.99
...........
).

Можно ли это сделать, используя только функции массива, без цикла?

спросил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
1
Решение
245

PHP 5. 5+ двухстрочное решение с использованием array_chunk и array_column:

$input  = '1-350,9-390.99';

$chunks = array_chunk(preg_split('/(-|,)/', $input), 2);
$result = array_combine(array_column($chunks, 0), array_column($chunks, 1));

print_r($result);

Урожайность:

Array
(
[1] => 350
[9] => 390.99
)

Посмотрите его онлайн на 3v4l.org.

ответил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
194

Вот способ сделать это без цикла for, используя array_walk:


$array = explode(',', $string);
$new_array = array();
array_walk($array,'walk', $new_array);

function walk($val, $key, &$new_array){
$nums = explode('-',$val);
$new_array[$nums[0]] = $nums[1];
}

Пример Ideone.com.

ответил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
126

Что-то вроде этого должно работать:


$string = '1-350,9-390.99';

$a = explode(',', $string);

foreach ($a as $result) {
$b = explode('-', $result);
$array[$b[0]] = $b[1];
}

ответил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
124

Здесь используется массив_walk с закрытием .


<?php
$string = "1-350,9-390.99";
$partial = explode(',', $string);
$final = array();
array_walk($partial, function($val,$key) use(&$final){
list($key, $value) = explode('-', $val);
$final[$key] = $value;
});
print_r($final);
?>

Интерактивная скрипта.

ответил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
76

Проверен код.


<?php
$array = "1-350,9-390.99";
$arr = explode(",",$array);

$desireArray = array();
foreach($arr as $value)
{
$val = explode("-",$value);
$desireArray[$val[0]] = $val[1];
}
?>


Все самое лучшее.

ответил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
77

$x='1-350,9-390.99';
$arr1=explode(',',$x);
$res_arr=array();
foreach($arr1 as $val){
$arr2=explode('-',$val);
$res_arr[$arr2[0]]=$arr2[1];
}

print_r($res_arr);

ответил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
76

Технически это можно сделать без использования циклов (demo на codepad.org):


$string = '1-350,9-390.99';

// first, split the string into an array of pairs
$output = explode(',', $string);
function split_pairs ($str) {
return explode('-', $str, 2);
}
$output = array_map(split_pairs, $output);

// then transpose it to get two arrays, one for keys and one for values
array_unshift($output, null);
$output = call_user_func_array(array_map, $output);

// and finally combine them into one
$output = array_combine($output[0], $output[1]);

var_export($output);


Однако это действительно не то, что вы хотели бы сделать в реальном коде — он не только смехотворно запутан, но и почти наверняка менее эффективен, чем простое решение на основе foreach, которое другие уже предоставили (demo на codepad.org):


$output = array();
foreach ( explode( ',', $string ) as $pair ) {
list( $key, $val ) = explode( '-', $pair, 2 );
$output[$key] = $val;
}

ответил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
76

$string = '1-350,9-390.99........';
$final_result = array();
foreach (explode(',', $string) as $piece) {
$result = array();
$result[] = explode('-', $piece);
$final_result[$result[0]] = $result[1];
}

print_r($final_result);

ответил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
63

Попробуйте следующее:


$string = '1-350,9-390.99';
$array = explode(',', $string);

$output = array();
foreach($array as $arr){
$chunk = explode('-', $arr);
$output[$chunk[0]] = $chunk[1];
}
echo '<pre>'; print_r($output); echo '</pre>';

ответил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
63

Попробуйте это


<?php
$string="1-350,9-390.99,4-569.34";
$values=explode(",",$string);
$output=array();
foreach($values as $value)
{
list($k,$v)=explode("-",$value);
$output[$k]=$v;
}
print_r($output);
?>

ответил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
45

Это то, что вам нужно?


<?php 
//the string to process
$str = "1-350,9-390.99";

//explode it
$str_exploded = explode(",",$str);

$final_arr;
foreach($str_exploded as $str_elem){
//extract
$str_elem_final = explode("-",$str_elem);
//the first elem is the index and the last elem is the value
$final_arr[(int)$str_elem_final[0]] = $str_elem_final[1];

}
print_r($final_arr);

?>


http://rextester.com/VEY59445

ответил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
45

Лично я использую:


/**
* @desc String to associative array
*
* @param string $string
* @param string $element_delimiter
* @param string $value_delimiter
*
* @example
$string = "1:9|class:fa fa-globe";
$array = string_to_array($string);
*
* @return array $results
*/
function string_to_array($string, $element_delimiter = '|', $value_delimiter = ':') {
$results = array();
$array = explode($element_delimiter, $string);
foreach ($array as $result) {
$element = explode($value_delimiter, $result);
$results[$element[0]] = $element[1];
}
return $results;
}

/**
* @desc Associative array to string
*
* @param type $array
* @param type $element_delimiter
* @param type $value_delimiter
*
* @example
$array = array('class' => 'in-line', 'rel' => 'external');
$string = array_to_string($array);
*
* @return string
*/
function array_to_string($array, $element_delimiter = '|', $value_delimiter = ':') {
array_walk($array, create_function('&$i,$k', 'if (strlen($k) > 0){$i="' . $element_delimiter . '$k' . $value_delimiter . '$i";}'));
return substr(implode($array, ""), 1);
}

ответил(а) 2021-01-25T12:04:36+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема