PHP:如何通过循环推送键/值对?

时间:2019-01-21 09:16:48

标签: php arrays

早上好,

我有一个嵌套数组,并且找到了一种打印它的方法。 但是我需要将其转换为更简单的数组,以便最后将其导出为.csv。

1。首先,我的json结果是这样的嵌套数组(实际上有更多的子数组):

["DATA"=>[
    0["ID"=>"123456789",
      "STORE"=>[0["NAME"=>"my store ","STREET"=>"baker street" ]]],
    1["ID"=>"987654321",
      "STORE"=>[0["NAME"=>"the last irish pub","STREET"=>"Endov Daworld Street",]]]]]

2。以及Tran Duc Thang先生的函数代码(非常感谢) 我可以打印出来。但是我尝试重新使用他的代码,以创建如下更简单的数组:

Array(
    0("ID"=>"123465789","Name"=>"my store",...),
    1("ID"=>"987654321","Name"=>"the last irish pub",...))

3。代码:

$dest_array = array();
class Foo {
    public static function formatArray($arr){
        foreach ($arr as $key=> $value){
            if(is_array($value)) {
                if(!empty($value)) {
                     self::formatArray($value);
                }
            } else {    
                    $dest_array[$key] = $value;
            }
        }
    }
}

Foo::formatArray($json_decoded); 

foreach($dest_array as $k => $v) {
    echo "$k => $val";
}

var_dum($dest_array)告诉我数组为空array (size = 0)

我尝试使用array_push代替$dest_array[$key] = $value 但它也不起作用。

我错过了什么? 请问有什么想法吗?

谢谢

3 个答案:

答案 0 :(得分:0)

您不需要递归,只需嵌套循环即可。外层循环处理DATA数组,内层循环处理STORE数组。

$dest_array = array();
foreach ($json_decoded['DATA'] as $data) {
    $id = $data['ID'];
    foreach ($data['STORE'] as $store) {
        $store['ID'] = $id;
        $dest_array[] = $store;
    }
}

答案 1 :(得分:0)

您的函数无法访问变量所在的全局范围。您有2种选择-要么具有全局范围(通常不好)

  int *hugeList = malloc(10000000);
  for (long i = 0; i < 1000000; ++i)
  {
      hugeList[i] = (rand() % 100);//random integers from 0 to 99
  }
  long *subList[8];//to fill each thread's result
  #pragma omp parallel
  for (long i = 0; i < 1000000; ++i)
  {
     long n = 0;
     if(hugeList[i] < 10)
     {
        //do something to fill "subList" properly
        subList[threadNo][n] = hugeList[i];
        n++;
     }
  }

或作为一种更好的解决方案,以基数组返回您的新结构(然后没有全局依赖性!)

class Foo {
    public static function formatArray($arr){
        global $dest_array; // <<< makes it available
        foreach ($arr as $key=> $value){
            if(is_array($value)) {
                if(!empty($value)) {
                     self::formatArray($value);
                }
            } else {    
                    $dest_array[$key] = $value;
            }
        }
    }
}

答案 2 :(得分:0)

您的代码至少有3个问题:

  • 首先,当$value是一个数组时,请对其进行格式化,但对结果不执行任何操作
  • 您尝试递归进行操作,但是您有2个步骤的行为有所不同:对于直接位于“ DATA”内部的数组,您希望保持数组的唯一性,但是对于其中的内容,您要“展平”它们,这意味着后面的键将替换现有的键,如果进行完全递归,则只有一组结果,而不是示例中的2个结果。
  • 您尝试通过rerence进行修改,并为结果添加一个新数组,这是两种不同的方法。

修改后的代码-它在结果的每一行上调用格式化程序(否则递归函数将合并两个存储):

$json_decoded = [
    "DATA" => [
        ["ID"=>"123456789", "STORE"=> [ ["NAME"=>"my store ", "STREET"=>"baker street"] ] ],
        ["ID"=>"987654321", "STORE"=> [ ["NAME"=>"the last irish pub", "STREET"=>"Endov Daworld Street"] ] ],
    ],
]; 

class Foo {
    public static function formatArray($arr){
        $dest_array = [];
        foreach ($arr as $key=> $value){
            if(is_array($value)) {
                if(!empty($value)) {
                    foreach(self::formatArray($value) as $key2=> $value2){
                        $dest_array[$key2] = $value2;
                    }
                }
            } else {
                $dest_array[$key] = $value;
            }
        }
        return $dest_array;
    }
}

foreach($json_decoded['DATA'] as $k => $v) {
    $v = Foo::formatArray($v);
    foreach($v as $k2 => $v2) {
        echo "$k2 => $v2 <br>";
    }
    echo "<br>";
}