Explotar una cadena a una matriz asociativa sin usar bucles

Tengo una cadena como 1-350,9-390.99,... , y necesito convertirla en una matriz asociativa como esta:

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

¿Es posible hacer esto usando solo funciones de matriz, sin un bucle?

Aquí hay una manera de hacerlo sin un bucle for, usando 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]; } 

Ejemplo en Ideone.com .

Solución PHP 5.5+ de dos líneas, usando array_chunk y 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); 

Rendimientos:

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

Véalo en línea en 3v4l.org.

Algo como esto debería funcionar:

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

Esto usa array_walk con un cierre .

 < ?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); ?> 

Violín interactivo .

 $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); 
 $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); 

Técnicamente, es posible hacer esto sin usar loops ( demo en 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); 

Sin embargo, esto realmente no es algo que quieras hacer en código real, no solo es ridículamente intrincado, sino que también es casi con certeza menos eficiente que la simple solución basada en Foreach que otros ya han dado ( demo en codepad.org ):

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

El código está probado.

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

Todo lo mejor.

Prueba esto

 < ?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); ?> 

Prueba esto:

 $string = '1-350,9-390.99'; $array = explode(',', $string); $output = array(); foreach($array as $arr){ $chunk = explode('-', $arr); $output[$chunk[0]] = $chunk[1]; } echo '
'; print_r($output); echo '

';

¿Es esto lo que quieres?

 < ?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

Personalmente uso:

 /** * @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); }