【问题标题】:Explode a string to associative array without using loops? [duplicate]在不使用循环的情况下将字符串分解为关联数组? [复制]
【发布时间】:2013-01-03 05:57:46
【问题描述】:

我有一个像1-350,9-390.99,... 这样的字符串,我需要把它变成这样的关联数组:

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

是否可以只使用数组函数而不使用循环来做到这一点?

【问题讨论】:

标签: php arrays


【解决方案1】:

PHP 5.5+两行方案,使用array_chunkarray_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
)

See it online at 3v4l.org.

【讨论】:

  • parse_str(str_replace(",","&",$str), $output);
  • 输入没有值的情况如何?例如。 $input = '1-,9-390.99';
  • @MatissJurgelis ...它会产生expect[ 1 => '', 9 => '390.99' ]
  • 捕获组不是必须的。
【解决方案2】:

这是一种无需 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 上的示例。

【讨论】:

  • +1 好答案!我唯一会回避的是global。您应该能够通过引用传递一个外部数组作为array_walk 的第三个参数。
  • 我尝试使用&$new_array 传递数组,但它不起作用。为什么global 不好?
  • 找到了。我必须将 &$new_array 放在 array_walk 函数中,而不是“walk”函数中。谢谢@hafichuk!
  • 它们本身并不坏。我主要做 OOP,所以我只是因为范围问题而回避它们。
  • parse_str(str_replace(",","&",$str), $output);
【解决方案3】:

这样的事情应该可以工作:

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

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

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

【讨论】:

  • 虽然 2013 年 1 月 3 日 6:05 左右是发布“试试这个”答案的非常受欢迎的时间(FGITW 发布的不幸后果),但这个答案缺少其教育解释。在您回答后,OP 规定他们对利用语言结构的答案不感兴趣,并且更愿意接受基于函数的技术。
【解决方案4】:

这使用array_walkclosure

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

Interactive fiddle.

【讨论】:

    【解决方案5】:
    $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);
    

    【讨论】:

    • 虽然 2013 年 1 月 3 日 6:05 左右是发布“试试这个”答案的非常受欢迎的时间(FGITW 发布的不幸后果),但这个答案缺少其教育解释。在您回答后,OP 规定他们对利用语言结构的答案不感兴趣,并且更愿意接受基于函数的技术。
    【解决方案6】:
    $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);
    

    【讨论】:

    • 虽然 2013 年 1 月 3 日 6:05 左右是发布“试试这个”答案的非常受欢迎的时间(FGITW 发布的不幸后果),但这个答案缺少其教育解释。在您回答后,OP 规定他们对利用语言结构的答案不感兴趣,并且更愿意接受基于函数的技术。
    【解决方案7】:

    从技术上讲, 可以在不使用循环的情况下做到这一点 (demo on 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 on codepad.org):

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

    【讨论】:

    • 迭代数据的函数仍在“循环”中。
    • @mickmackusa:当然,引擎盖下的某个地方可能有一个循环。就此而言,PHP 解释器几乎可以肯定无论如何都使用循环来执行代码,所以即使执行echo "Hello, World!" 也可能涉及一个循环(或多个!),如果你看得够深的话。尽管如此,上面的代码中并没有 explicit 循环,这确实是人们所能要求的最多的。
    【解决方案8】:

    试试这个:

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

    【讨论】:

    • 虽然 2013 年 1 月 3 日 6:05 左右是发布“试试这个”答案的非常受欢迎的时间(FGITW 发布的不幸后果),但这个答案缺少其教育解释。在您回答后,OP 规定他们对利用语言结构的答案不感兴趣,并且更愿意接受基于函数的技术。
    【解决方案9】:

    这是你想要的吗?

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

    【讨论】:

      【解决方案10】:

      我个人使用:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-21
        • 2012-06-29
        • 2019-12-08
        • 1970-01-01
        • 2023-03-29
        • 2013-01-17
        • 1970-01-01
        相关资源
        最近更新 更多