将数据添加到关联数组

时间:2016-07-05 12:22:48

标签: php arrays

我在填充数组时出现问题。我有一个csv文件,其中包含一些包含一些ID的列。我加载并处理csv并最终得到一个像这样的数组

array:5 [▼
  0 => array:2 [▼
    0 => "ID123"
  ]
  1 => array:2 [▼
    0 => "ID234"
  ]
  2 => array:2 [▼
    0 => "ID345"
  ]
  3 => array:2 [▼
    0 => "ID456"
  ]
  4 => array:2 [▼
    0 => "ID567"
  ]
]

使用这些ID我在ID上点击API以获取特定于该ID的数据。所以我循环包含id的数组并执行类似下面的操作

$jobData = array();

foreach($csv as $data) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://api.somdomain/some.api/get/".$data[0].");
    //other curl stuff

    $output = curl_exec($ch);
    $output = new \SimpleXMLElement($output);
}

现在,如果我输出输出结果,我会得到类似的结果

SimpleXMLElement {#352 ▼
  +"Job": SimpleXMLElement {#383 ▼
    +"ID": "ID123"
    +"Client": SimpleXMLElement {#387 ▼
      +"ID": "12345"
    }
    +"Assigned": SimpleXMLElement {#392 ▼
      +"Staff": array:5 [▼
        0 => SimpleXMLElement {#403 ▼
          +"ID": "12345"
        }
        1 => SimpleXMLElement {#404 ▼
          +"ID": "23456"
        }
        2 => SimpleXMLElement {#405 ▼
          +"ID": "34567"
        }
      ]
    }
  }
}

所以我需要建立一个包含我所有ID的数据的数组。所以在上面的foreach循环中,我正在做这样的事情

foreach($csv as $data) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://api.somdomain/some.api/get/".$data[0].");
    //other curl stuff

    $output = curl_exec($ch);
    $output = new \SimpleXMLElement($output);

    if (!empty($output)) {
        $jData['jobInfo'] = array(
            'clientId' => (string)$output->Job->Client->ID,
            'startDate' => '20160701',
            'dueDate' => '20160731'
        );

        if(!empty($output->Job->Assigned->Staff)) {
            foreach ($output->Job->Assigned->Staff as $staff) {
                $jData['staffInfo'][] = array(
                    'staffId' => (string)$staff->ID
                );
            }
        }
    }
    $jobData[] = $jData;
}

现在这很有用。我在staffInfo元素中添加了一个额外的[] onyo,因为上面的输出可以显示超过1个工作人员。我遇到的问题 以上是它似乎复制了一些东西。所以jobData数组的输出如下

array:5 [▼
  0 => array:4 [▼
    "jobInfo" => array:4 [▶]
    "staffInfo" => array:5 [▶]
  ]
  1 => array:4 [▼
    "jobInfo" => array:4 [▶]
    "staffInfo" => array:6 [▶]
  ]
  2 => array:4 [▼
    "jobInfo" => array:4 [▶]
    "staffInfo" => array:7 [▶]
  ]
  3 => array:4 [▼
    "jobInfo" => array:4 [▶]
    "staffInfo" => array:8 [▶]
  ]
  4 => array:4 [▼
    "jobInfo" => array:4 [▶]
    "staffInfo" => array:15 [▶]
  ]
]

如您所见,元素0有一个大小为5的数组,用于staffInfo。元素1增加到6,元素2增加到7,元素3增加到8,元素4增加到15.如果我手动检查API正在调用系统, 元素0应该有5是正确的。元素1应为1,元素2应为1,元素3应为1,元素4应为7。

那么如何阻止这个将前面的循环结果添加到下一个结果?

由于

1 个答案:

答案 0 :(得分:1)

您无法在任何地方初始化$jData。这是一种不好的做法。结果,它总是一样的。您将继续覆盖jobInfo,并继续添加到staffInfo

您需要在每次迭代开始时初始化数组。