PHP-多维数组到CSV

PHP-多维数组到CSV,php,csv,Php,Csv,我目前已经编写了一种将多维数组转换为逗号分隔值的方法(为了便于调试,我使用管道而不是逗号)。问题是,我知道我用来做这件事的代码非常糟糕。我希望它能正常工作,但一点也不好 我需要什么 目前,arr\u to\u csv()函数适用于多维数组中的五级嵌套数据。我需要一个递归函数来对一个或无限数量的嵌套数组执行相同的操作,或者在正确的方向上进行良好的微调。递归根本不是我的强项,但我知道它是前进的方向 数据输入 多维数组被传递给函数 array 'name' => array

我目前已经编写了一种将多维数组转换为逗号分隔值的方法(为了便于调试,我使用管道而不是逗号)。问题是,我知道我用来做这件事的代码非常糟糕。我希望它能正常工作,但一点也不好

我需要什么

目前,
arr\u to\u csv()
函数适用于多维数组中的五级嵌套数据。我需要一个递归函数来对一个或无限数量的嵌套数组执行相同的操作,或者在正确的方向上进行良好的微调。递归根本不是我的强项,但我知道它是前进的方向

数据输入

多维数组被传递给函数

array
  'name' => 
      array
         'singular' => null
         'plural' => null
  'fields' => 
      array
         'price' => 
            array
               'label' => string 'Preis' (length=5)
               'company_id' => 
                  array
                     'label' => null
                     'placeholder' => null
                     //...the array could go on...
该函数返回以下…

这正是我想要的

0 => string 'name||singular||null' (length=20)
1 => string 'name||plural||null' (length=18)
2 => string 'fields||price||label||Preis' (length=27)
3 => string 'fields||company_id||label||null' (length=31)
4 => string 'fields||company_id||placeholder||null' (length=37)
5 => string 'fields||name||label||null' (length=25)
6 => string 'fields||name||placeholder||null' (length=31)
我可怕的构造函数

我不擅长递归,下面是我的
foreach
s糟糕列表。正如您从下面的代码中看到的,这很糟糕(不需要阅读全部内容,它只是复制本身)。请帮我整理一下我的可怕代码

function arr_to_csv($data,$csv = '||') {

$array = array();

/* Epic amount of for each's. This could be done with recursion */
foreach($data as $key => &$value) {
    if (!is_array($value)) {
        $array[] = $key . $csv .(is_null($value)?'null':$value);
    } else {
        foreach ($value as $k => &$v) {
            if (!is_array($v)) {
                $array[] = $key . $csv . $k . $csv . (is_null($v) ? 'null' : $v);
            } else {
                foreach ($v as $kk => &$vv) {
                    if (!is_array($vv)) {
                        $array[] = $key . $csv . $k . $csv . $kk . $csv . (is_null($vv) ? 'null' : $vv);
                    } else {
                        foreach ($vv as $x => &$y) {
                            if (!is_array($y)) {
                                $array[] = $key . $csv . $k . $csv . $kk . $csv. $x . $csv . (is_null($y) ? 'null' : $y);
                            } else {
                                foreach ($y as $too => $long) {
                                    if(!is_array($long)) {
                                        $array[] = $key . $csv . $k . $csv . $kk . $csv. $x . $csv . $too . $csv. (is_null($long)?'null':$long);
                                    } else {
                                        foreach ($long as $omg => $why) {
                                            if(!is_array($why)) {
                                                $array[] = $key . $csv . $k . $csv . $kk . $csv. $x . $csv . $too . $csv . $omg . $csv . (is_null($why) ? 'null' : $why);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    } 
}    
return $array;
}

我没有检查它,所以如果它不工作,应该纠正它

function readarray($from_array, $addr = array()) {
    global $output;
    foreach ($from_array as $key => $value) {
        if (is_Array($value) && count($value) > 0) {
            $addr[] = $key;
            readarray($value, $addr);
        } else {
            $output[] = implode('||', $addr) . $value;
        }
    }

}


$output = array();
foreach ($my_array as $key=>$value){
readarray($value); 
}

//改进后可以得到初始数组根的单独数组

我没有检查它,所以如果它不工作,应该更正它

function readarray($from_array, $addr = array()) {
    global $output;
    foreach ($from_array as $key => $value) {
        if (is_Array($value) && count($value) > 0) {
            $addr[] = $key;
            readarray($value, $addr);
        } else {
            $output[] = implode('||', $addr) . $value;
        }
    }

}


$output = array();
foreach ($my_array as $key=>$value){
readarray($value); 
}

//改进后可以获得初始数组根的单独数组

不确定这是否会对您有所帮助,但先展平数组,然后按您想要的方式格式化,会不会更容易?要展平阵列,请尝试以下操作:

$array = "YOUR ARRAY";

$FlatArray = array();

foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $k=>$v)
  {
    $FlatArray[$k] = $v;
  }
我整个上午都在试图为这个问题找到一个递归函数。这是我得到的最接近的,也许你可以改进

$data = array('name' =>array('singular' => NULL,'plural' => NULL,'fields' =>array('price' =>array('label' =>'Preis','company_id' =>array('label' => NULL,'placeholder' => NULL)))));


function arr_to_csv($data,$csv = '||')
{
$list = "";
foreach($data as $key => &$value)
        {
        $list .= $key . $csv .((!is_array($value))?(is_null($value)?'null':$value): arr_to_csv($value))."<br>";
        }
return $list;
}   



print_r(arr_to_csv($data));

不确定这是否会对您有所帮助,但先展平阵列,然后按您想要的方式格式化,这不是更容易吗?要展平阵列,请尝试以下操作:

$array = "YOUR ARRAY";

$FlatArray = array();

foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $k=>$v)
  {
    $FlatArray[$k] = $v;
  }
我整个上午都在试图为这个问题找到一个递归函数。这是我得到的最接近的,也许你可以改进

$data = array('name' =>array('singular' => NULL,'plural' => NULL,'fields' =>array('price' =>array('label' =>'Preis','company_id' =>array('label' => NULL,'placeholder' => NULL)))));


function arr_to_csv($data,$csv = '||')
{
$list = "";
foreach($data as $key => &$value)
        {
        $list .= $key . $csv .((!is_array($value))?(is_null($value)?'null':$value): arr_to_csv($value))."<br>";
        }
return $list;
}   



print_r(arr_to_csv($data));

这是一些伪代码,但这只是一个开始:

$strings = [];
$flattenArray = function($arr, $level) use (&$strings, &$flattenArray) {

    foreach($arr as $key=>$value){
        $s = &$strings[$level];
        if(!isset($s)) { $s = array(); }
        $s[] = $key;
        if(is_array($value)) {
           $flattenArray($value, $level);
        }
        else {
           $s[] = $value;
        }
        $level ++;
    }
};
$flattenArray($myArray, 0);
foreach($strings as &$arr) {
     $arr = implode("||", $arr);
}

小演示:这是一些伪代码,但这只是一个开始:

$strings = [];
$flattenArray = function($arr, $level) use (&$strings, &$flattenArray) {

    foreach($arr as $key=>$value){
        $s = &$strings[$level];
        if(!isset($s)) { $s = array(); }
        $s[] = $key;
        if(is_array($value)) {
           $flattenArray($value, $level);
        }
        else {
           $s[] = $value;
        }
        $level ++;
    }
};
$flattenArray($myArray, 0);
foreach($strings as &$arr) {
     $arr = implode("||", $arr);
}


带:XML的小演示会很好。但也有结构。看到这篇文章就有了一个想法。XML很旧,请尝试JSON。只要做json_encode($array),你就完成了:)嘿,伙计们,我真的应该加上这个:数据与父/子值一起存储在MySQL数据库中(是的,一个树结构插入其中),因此可以单独检索、修改和重新保存这些值。因此,我只需要我的函数递归地工作,并且代码行要少得多:)XML就好了。但也有结构。看到这篇文章就有了一个想法。XML很旧,请尝试JSON。只要做json_encode($array),你就完成了:)嘿,伙计们,我真的应该加上这个:数据与父/子值一起存储在MySQL数据库中(是的,一个树结构插入其中),因此可以单独检索、修改和重新保存这些值。因此,我只需要我的函数递归地工作,代码行要少得多:)@Artaex Media:ahah,my style=)@Artaex Media嘿嘿,你撕掉了“global$my_array”,没有它就无法工作it@EL这不能正常工作,因为它返回
name | | fields | | price | | Preis
。名称和字段是两个独立的数组。它应该返回
字段| |价格| | Preis
。出于某种原因,它还会在顶部放置两次
name |
。可能需要您的帮助才能使其更可靠?@EL我不知道是谁教您PHP的,但您听说过“return”吗?如果全局变量可以用不同的方式完成,则永远不要使用它。@Artaex Media:在这种情况下,不需要“返回”。如果需要,可以通过为输出数据添加第三个参数来修改代码。@Artaex Media:ahah,my style=)@Artaex Media嘿嘿,您已经删除了“global$my_array”,如果没有它,它将无法工作it@EL这不能正常工作,因为它返回
name | | fields | | price | | Preis
。名称和字段是两个独立的数组。它应该返回
字段| |价格| | Preis
。出于某种原因,它还会在顶部放置两次
name |
。可能需要您的帮助才能使其更可靠?@EL我不知道是谁教您PHP的,但您听说过“return”吗?如果全局变量可以用不同的方式完成,则永远不要使用它。@Artaex Media:在这种情况下,不需要“返回”。如果需要,可以通过为输出数据添加第三个参数来修改代码。展平数组会导致其失去结构。不幸的是,发生在这个数组上的任何事情都必须是可逆的,所以这不会起作用。@Jimbo刚刚用递归函数编辑了我的答案。很接近,也许我们可以结合Neals的答案。。。现在来看一下。@ROYFinley您的答案对数组中的数组不起作用,对数组中的数组进行整平(等等)。整平数组会导致它失去结构。不幸的是,发生在这个数组上的任何事情都必须是可逆的,所以这不会起作用。@Jimbo刚刚用递归函数编辑了我的答案。很接近,也许我们可以结合Neals的答案。。。现在来看一下。@ROYFinley你的答案不适用于数组中的数组,而适用于数组中的数组winthin数组(等等)。感谢你迄今为止的帮助Neal,我需要找出其中的递归并使其正常工作-但这是一个很好的开始,因此感谢你的帮助@Jimbo没问题^ ^很乐意帮忙@ROYFinley哈哈,如果最后一个解决方案完全有效,谢谢^ ^ idk,但它非常接近:-)它只需要稍微调整一下!太近了!但是,例如,有
字段|白色|空
而不是
字段|类别|颜色|白色|空
;所以我不确定那里发生了什么。@Jimbo我相信你能弄清楚:-)谢谢你到目前为止的帮助Neal,我需要弄清楚其中的递归并让它正常工作