多维数组转字符串

16

我正在尝试将一个多维数组转换成特定格式的字符串。

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在处理数组值时表现得与处理字符串时不同,或者可能我只是没有正确地看待它。你能否使用implode对数组值进行操作?


循环遍历任何类型的多维数组通常需要两个嵌套循环。首先遍历第一个数组,然后遍历第二个数组,完成后移动到下一个数组,再进行循环。以此类推。 - Tony The Lion
一个5秒钟的谷歌搜索结果为:http://php.net/manual/en/function.join.php 在评论中,你会找到一个递归连接片段,应该适合你的需求。 - Shmiddty
10个回答

22

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

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

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

谢谢您,我将研究这个,因为我的许多问题都被“array_map”回答了。 - user1631995

7

看看我的版本。它可以将任何维度压缩:

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...”的情况?谢谢。 - Abraham Murciano Benzadon
1
不要使用 is_array($arr[$i]),而是使用 @is_array($arr[$i])我已经在代码中进行了更改。 - Jeff_Alieffson
谢谢,但是@符号有什么作用?我试着在谷歌上搜索,但是没有找到相关文档...谢谢。 - Abraham Murciano Benzadon
看看这个 PHP 文档:http://php.net/manual/zh/language.operators.errorcontrol.php - Jeff_Alieffson
谢谢。在你告诉我关于@之前,我想出的另一个解决方案是在函数开始时将数组转换为数字数组。 - Abraham Murciano Benzadon

3
我尝试了很多,但没有一个完全符合我的要求。最接近的是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;
}

1
这是一个简单的答案:

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

好的,愉快编程!


谢谢这个代码。我修复了几行。 function implode_recur ($separator, $arrayvar){ $output = ''; foreach ($arrayvar as $av) { if (is_array ($av)) { $output .= implode_recur($separator, $av); } else { $output .= $separator.$av; } } return $output; } - Ezequiel Villarreal

1

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


你的回答有效。在你未来的回答中,请包含示例代码和文档链接。 - Jose Manuel Abarca Rodríguez

1
将内部数组保存到一个数组中,然后将它们压缩。

(按照您原始实现的精神编写)

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

啊,是的,这就是精神所在。我应该早点寻求帮助,我发布的代码经过多个小时的头痛后变得一团糟。 - user1631995

0
你可以使用这行代码将数组转换为字符串:
$output = implode(", ",array_map(function($a) { return '<a href="'.$a['slug'].'">'.$a['name'].'</a>'; }, $your_array) );

print_r($output);

输出:

链接1,链接2,链接3


0

递归合并:

function arrayToString($arrs,$sep=' ')
{
    if(!is_array($arrs)) return $arrs;
        
    $list=array();
    foreach($arrs as $arr)
    {
        if(is_array($arr))
        {
            $list[]=$this->arrayToString($arr,$sep);
        }
        else
        {
            $list[]=JString::trim($arr);
        }
    }
    return implode($sep,$list);
}

0

您也可以直接从 PHP join 手册中获取原始实现(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

0
如果有人需要一个安全的通用函数来处理二维数组(比如表格),并且可以支持添加键名,我认为这个函数可以很好地胜任:
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;
}
  • 我使用这个函数作为一个数组转CSV字符串的工具

所以,如果我们的输入如下:

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

结果将会是:

blue;red;green
one;three;twenty

另一个 implode 键的示例:

$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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接