У меня есть строка, например, 1-350,9-390.99,...
, и мне нужно превратить ее в ассоциативный массив следующим образом:
Array ( [1] => 350 [9] => 390.99 ........... ).
Можно ли это сделать, используя только функции массива, без петель?
Вот способ сделать это без цикла 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 .
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.
Что-то вроде этого должно работать:
$string = '1-350,9-390.99'; $a = explode(',', $string); foreach ($a as $result) { $b = explode('-', $result); $array[$b[0]] = $b[1]; }
Это использует array_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); ?>
Интерактивная скрипка .
$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);
Технически это можно сделать без использования циклов ( 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
другие уже предоставили ( демо на codepad.org ):
$output = array(); foreach ( explode( ',', $string ) as $pair ) { list( $key, $val ) = explode( '-', $pair, 2 ); $output[$key] = $val; }
$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);
Попробуй это
<?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); ?>
Попробуй это:
$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>';
Код проверен.
<?php $array = "1-350,9-390.99"; $arr = explode(",",$array); $desireArray = array(); foreach($arr as $value) { $val = explode("-",$value); $desireArray[$val[0]] = $val[1]; } ?>
Всего наилучшего.
Это то, чего вы хотите?
<?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); ?>
Лично я использую:
/** * @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); }