【问题标题】:Multidimensional Array to String多维数组到字符串
【发布时间】:2012-09-06 22:01:37
【问题描述】:

我正在尝试将多维数组转换为具有特定格式的字符串。

function convert_multi_array($array) {
    foreach($array as $value) {
        if(count($value) > 1) {
            $array = implode("~", $value);
        }
        $array = implode("&", $value);
    }
    print_r($array);
}
$arr = array(array("blue", "red", "green"), array("one", "three", "twenty"));
convert_multi_array($arr);

应该输出:blue~red~green&one~three~twenty ... 等等更多子数组。

我只想说,我无法生成任何接近我想要的结果的代码。两个小时后,这几乎是我能得到的最好的。我不知道为什么内爆的行为与通常对字符串的行为不同,或者我可能只是看不正确。你可以对数组值使用 implode 吗?

【问题讨论】:

  • 循环任何类型的多维数组通常需要嵌套两个循环。循环第一个数组,然后循环第二个数组,完成后,移动到下一个数组,循环。等等
  • 一个 5 秒的 google 搜索结果如下:php.net/manual/en/function.join.php 在 cmets 中,您会找到一个适合您需要的递归 join sn-p。

标签: php


【解决方案1】:

我尝试了很多这些,但没有一个为我勾选了所有框。 最后一个是Jeff_Alieffsons

这是一个调整后的版本,你可以将任何多维数组放入其中,然后它会返回一个字符串。

function implode_all( $glue, $arr ){
  if( is_array( $arr ) ){

    foreach( $arr as $key => &$value ){

      if( @is_array( $value ) ){
        $arr[ $key ] = implode_all( $glue, $value );
      }
    }

    return implode( $glue, $arr );
  }

  // Not array
  return $arr;
}

【讨论】:

    【解决方案2】:

    这是一个简单的答案:

        function implode_recur ($separator, $arrayvar){
            $output = "";
             foreach ($arrayvar as $av)
             {
                 if (is_array ($av))
                 {
                    $output .= implode_r ($separator, $av);
                 }
                else
                {
                    $output .= $separator.$av;
                }
                return $output;
             }
        }
        $result = implode_recur(">>",$variable);
    

    好的,编码愉快!

    【讨论】:

    • 感谢这个。我修复了一些行函数 implode_recur ($separator, $arrayvar){ $output = ''; foreach ($arrayvar as $av) { if (is_array ($av)) { $output .= implode_recur($separator, $av); } 其他 { $output .= $separator.$av; } } 返回 $ 输出; }
    【解决方案3】:

    看看我的版本。它内爆任何维度:

    function implode_all($glue, $arr){            
        for ($i=0; $i<count($arr); $i++) {
            if (@is_array($arr[$i])) 
                $arr[$i] = implode_all ($glue, $arr[$i]);
        }            
        return implode($glue, $arr);
    }
    

    示例如下:

    echo implode_all(',', 
    array(
    1,
    2,
    array('31','32'),
    array('4'),
    array(
      array(511,512), 
      array(521,522,523,524),
      53))
    );
    

    将打印:

    1,2,31,32,4,511,512,521,522,523,524,53
    

    【讨论】:

    • 很好的答案!但是有什么方法可以避免 Notice: Undefined offset: 0 in... 用于关联数组?谢谢
    • 是的!而不是 is_array($arr[$i]) 写 @is_array($arr[$i]) 我已经更改了代码。
    • 谢谢,但是@ 有什么作用?我试过谷歌搜索,但我没有找到文档...谢谢
    • 谢谢。在您告诉我有关 @ 之前,我提出的另一个解决方案是在函数的开头将数组转换为数字数组
    【解决方案4】:

    可能没有兴趣,但我需要报告一个包含错误的嵌套数组,所以我简单地定义了一个变量,然后使用 json_encode 将其放入我的电子邮件中。将数组转换为字符串的一种方法。

    【讨论】:

    • 您的答案有效。对于您未来的答案,请包含示例代码和文档链接。
    【解决方案5】:

    您正在覆盖包含原始数组的$array。但是在 foreach 中,正在处理 $array 的副本,所以您基本上只是分配了一个新变量。

    您应该做的是遍历子数组并将它们“转换”为字符串,然后将结果内爆。

    function convert_multi_array($array) {
      $out = implode("&",array_map(function($a) {return implode("~",$a);},$array));
      print_r($out);
    }
    

    【讨论】:

    • 谢谢你,我将研究它是如何工作的,因为我的许多问题都已通过“array_map”得到解答。
    【解决方案6】:

    将内爆的内部数组保存到数组中。然后内爆那些。

    (本着您最初实现的精神编写)

    function convert_multi_array($arrays)
    {
        $imploded = array();
        foreach($arrays as $array) {
            $imploded[] = implode('~', $array);
        }
        return implode("&", $imploded);
    }
    

    【讨论】:

    • 啊,是的,这就是精神。我应该早点寻求帮助的,我发布的代码经过几个小时的敲打,一团糟。
    【解决方案7】:

    您也可以从 PHP 连接手册 (http://php.net/manual/en/function.join.php) 中获取原始实现

    function joinr($join, $value, $lvl=0)
    {
        if (!is_array($join)) return joinr(array($join), $value, $lvl);
        $res = array();
        if (is_array($value)&&sizeof($value)&&is_array(current($value))) { // Is value are array of sub-arrays?
            foreach($value as $val)
                $res[] = joinr($join, $val, $lvl+1);
        }
        elseif(is_array($value)) {
            $res = $value;
        }
        else $res[] = $value;
        return join(isset($join[$lvl])?$join[$lvl]:"", $res);
    }
    
    $arr = array(array("blue", "red", "green"), array("one", "three", "twenty"));
    joinr(array("&", "~"), $arr);
    

    这是递归的,所以你甚至可以这样做

    $arr = array(array("a", "b"), array(array("c", "d"), array("e", "f")), "g");
    joinr(array("/", "-", "+"), $arr);
    

    你会得到

    a-b/c+d-e+f/g
    

    【讨论】:

      【解决方案8】:

      你可以用这一行数组来串代码:

      $output = implode(", ",array_map(function($a) { return '<a href="'.$a['slug'].'">'.$a['name'].'</a>'; }, $your_array) );
      
      print_r($output);
      

      输出:

      链接1,链接2,链接3

      【讨论】:

        【解决方案9】:

        如果有人需要safe general function 来支持添加keys name 的二维数组(如表格),我认为这可能会很好:

        function arystr($ary='',$key=false,$rowsep=PHP_EOL,$cellsep=';') { // The two dimensional array, add keys name or not, Row separator, Cell Separator
            $str='';
            if (!is_array($ary)) {
                $str=strval($ary);
            } else if (count($ary)) {
                foreach ($ary as $k=>$t) {
                    $str.=($key ? $k.$cellsep : '').(is_array($t) ? implode($cellsep,$t) : $t);
                    end($ary);
                    if ($k !== key($ary)) $str.=$rowsep;
                }
            }
            return $str;
        }
        
        • 我将其用作 Array To CSV String 函数

        所以如果我们的输入是这样的:

        $a=array(array("blue", "red", "green"), array("one", "three", "twenty"));
        echo arystr($a);
        

        结果将是:

        blue;red;green
        one;three;twenty
        

        另一个内爆键的例子:

        $a = array(
          'first' => array
          (
            'a' , 'b'
          ),
          'second' => array
          (
            'c','d'
          ),
          'third' => array
          (
            'e','f'
          )
        );
        echo arystr($a,true,'|',',');
        

        结果:

        first,a,b|second,c,d|third,e,f
        

        【讨论】:

          猜你喜欢
          • 2014-04-18
          • 2017-07-08
          • 2014-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-12
          • 2019-02-06
          • 1970-01-01
          相关资源
          最近更新 更多