Php 是否在不使用循环的情况下将字符串分解为关联数组?

Php 是否在不使用循环的情况下将字符串分解为关联数组?,php,arrays,Php,Arrays,我有一个类似1-350,9-390.99,…的字符串,我需要将其转换为如下关联数组: Array ( [1] => 350 [9] => 390.99 ........... ) 是否可以只使用数组函数而不使用循环执行此操作?尝试以下操作: $string = '1-350,9-390.99........'; $final_result = array(); foreach (explode(',', $strin

我有一个类似
1-350,9-390.99,…
的字符串,我需要将其转换为如下关联数组:

 Array
    (
        [1] => 350
        [9] => 390.99
        ...........
    )
是否可以只使用数组函数而不使用循环执行此操作?

尝试以下操作:

$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);
$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>';
$string='1-350,9-390.99';
$array=explode(“,”,$string);
$output=array();
foreach($arr形式的数组){
$chunk=分解('-',$arr);
$output[$chunk[0]]=$chunk[1];
}
回声';打印(输出);回声';

类似的方法应该可以:

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

这就是你想要的吗

$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
的解决方案效率要低():

这使用了一个



.

这里有一种不用for循环的方法,使用:

示例。

我个人使用:

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

PHP 5.5+两行解决方案,使用和:

收益率:


那不是多维(?)爆炸是你的朋友。首先尝试使用“,”而不是“-”,并使用第一个索引作为键。这个如何:)parse_str(str_replace(“,”,“&“,$str),$output);我对重复标记提出质疑,理由是这个问题专门询问如何在没有循环的情况下完成。另一个问题没有这样的要求!唯一让我避讳的是
global
。您应该能够通过引用将外部数组作为
数组\u walk
的第三个参数传入。我尝试使用
和$new\u数组传递数组,但它不起作用。为什么
global
不好?找到了。我必须将&$new\u数组放在array\u walk函数中,而不是“walk”函数中。谢谢@hafichuk!它们并非天生就坏。我主要做OOP,所以我只是因为范围问题而避开它们;parse_str(str_replace(“,”,“&“,$str),$output);当输入没有值时,情况如何?例如$input='1-,9-390.99'@马蒂斯朱格里斯。。。它产生了人们想要的:
[1=>'',9=>'390.99']
捕获组是不必要的。虽然2013年1月3日6:05左右是发布“尝试这个”答案的非常流行的时间(FGITW发布的一个不幸后果),但这个答案缺少教育性的解释。在您回答之后,OP规定他们对利用语言结构的答案不感兴趣,更愿意接受基于函数的技术。尽管2013年1月3日6:05左右是发布“尝试这个”答案的非常流行的时间(FGITW发布的一个不幸后果),这个答案缺少教育意义上的解释。在您回答之后,OP规定他们对利用语言结构的答案不感兴趣,更愿意接受基于函数的技术。尽管2013年1月3日6:05左右是发布“尝试这个”答案的非常流行的时间(FGITW发布的一个不幸后果),这个答案缺少教育意义上的解释。在你回答之后,OP规定他们对利用语言结构的答案不感兴趣,而更喜欢接受基于函数的技术。迭代数据的函数仍然是“循环的”。@mickmackusa:当然,在引擎盖下面可能有一个循环。就这一点而言,PHP解释器几乎肯定是使用循环来执行代码的,因此即使执行
echo“Hello,World!”
也可能涉及一个(或几个!)循环(如果你看得够深的话)。尽管如此,上面的代码中没有明确的循环,这确实是人们最需要的。尽管2013年1月3日6:05左右是发布“试试这个”答案的非常流行的时间(这是FGITW发布的一个不幸结果),但这个答案缺少教育意义上的解释。在您回答之后,OP规定他们对利用语言结构的答案不感兴趣,而更愿意接受基于函数的技术。
$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);
$output = array();
foreach ( explode( ',', $string ) as $pair ) {
    list( $key, $val ) = explode( '-', $pair, 2 );
    $output[$key] = $val;
} 
<?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);
?>
$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];
}
/**
 * @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);
}
$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
)