
在现代web开发中,从外部api获取数据并进行处理是常见的任务。然而,api返回的数据往往包含一些无效或不必要的值,例如“n/a”、“-”或空字符串。为了确保数据质量和后续处理的准确性,我们需要对这些数据进行清洗。本教程将指导您如何使用php的curl库获取json数据,并实现一个通用的递归函数来高效地清理这些数据。
PHP的cURL扩展是进行HTTP请求的强大工具。通过它,我们可以轻松地向指定的URL发送GET请求并获取响应内容。
首先,我们需要初始化cURL会话,设置请求URL,并配置相关选项。
<?php // 定义目标API的URL $url = 'https://coderbyte.com/api/challenges/json/json-cleaning'; // 初始化cURL会话 $ch = curl_init($url); // 设置cURL选项 // CURLOPT_RETURNTRANSFER: 将curl_exec()获取的信息以字符串返回,而不是直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // CURLOPT_HEADER: 不包含响应头信息 curl_setopt($ch, CURLOPT_HEADER, 0); // 执行cURL请求并获取响应数据 $data = curl_exec($ch); // 关闭cURL会话 curl_close($ch); // 将JSON字符串解码为PHP数组 // 第二个参数为true表示解码为关联数组 $newData = json_decode($data, true); // 初始数据预览(可选) // echo "原始数据预览:\n"; // print_r($newData); ?>
代码解析:
我们的目标是清理JSON对象中包含特定“无效”值的键值对。具体规则如下:
立即学习“PHP免费学习笔记(深入)”;
由于JSON数据可能包含嵌套的对象或数组,我们需要一个能够深入遍历数据结构的解决方案。
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
为了处理嵌套的数据结构,最有效的方法是使用递归函数。该函数将检查当前元素是否为数组,如果是,则递归调用自身处理其子元素;如果不是,则根据清洗规则进行判断和移除。
<?php
/**
* 递归清洗数据对象或数组
* 移除值为 'N/A', '-', 或空字符串的元素
*
* @param array $data 需要清洗的数据数组
* @return array 清洗后的数据数组
*/
function clean_obj($data) {
// 确保处理的是数组类型
if (is_array($data)) {
foreach ($data as $key => $val) {
// 检查当前值是否为需要移除的无效值
if ($val === 'N/A' || $val === '-' || $val === '') {
unset($data[$key]); // 移除该键值对
}
// 如果当前值是数组,则递归调用自身进行清洗
else if (is_array($val)) {
$data[$key] = clean_obj($val);
// 递归清洗后,如果子数组变为空,也可能需要移除该键
// 根据具体需求决定是否添加此逻辑
// if (empty($data[$key])) {
// unset($data[$key]);
// }
}
}
}
return $data; // 返回清洗后的数据
}
// ... (cURL获取数据的代码,如上一节所示) ...
// 假设 $newData 已经通过 json_decode($data, true) 获得
// $newData = json_decode($data, true);
// 调用清洗函数
$cleaned_array = clean_obj($newData);
// 输出清洗后的结果
echo "清洗后的数据:\n";
echo "" . print_r($cleaned_array, 1) . "";
?>代码解析:
将获取数据和清洗逻辑结合起来,形成一个完整的脚本:
<?php
/**
* 递归清洗数据对象或数组
* 移除值为 'N/A', '-', 或空字符串的元素
*
* @param array $data 需要清洗的数据数组
* @return array 清洗后的数据数组
*/
function clean_obj($data) {
if (is_array($data)) {
foreach ($data as $key => $val) {
// 检查当前值是否为需要移除的无效值
// 使用 === 进行严格比较
if ($val === 'N/A' || $val === '-' || $val === '') {
unset($data[$key]); // 移除该键值对
}
// 如果当前值是数组,则递归调用自身进行清洗
else if (is_array($val)) {
$data[$key] = clean_obj($val);
// 可选:如果递归清洗后子数组变为空,也移除该键
// if (empty($data[$key])) {
// unset($data[$key]);
// }
}
}
}
return $data; // 返回清洗后的数据
}
// 目标API的URL
$url = 'https://coderbyte.com/api/challenges/json/json-cleaning';
// 初始化cURL会话
$ch = curl_init($url);
// 设置cURL选项
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 执行cURL请求
$data = curl_exec($ch);
// 关闭cURL会话
curl_close($ch);
// 检查cURL请求是否成功
if ($data === false) {
echo "cURL请求失败: " . curl_error($ch) . "\n";
exit;
}
// 将JSON字符串解码为PHP关联数组
$newData = json_decode($data, true);
// 检查JSON解码是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON解码失败: " . json_last_error_msg() . "\n";
exit;
}
// 调用清洗函数处理数据
$cleaned_array = clean_obj($newData);
// 输出清洗后的结果
// print_r($cleaned_array, 1) 会返回一个字符串,便于echo输出
echo "" . print_r($cleaned_array, 1) . "";
?>本教程展示了如何结合PHP的cURL库和递归函数,高效地从外部API获取并清洗JSON数据。通过定义清晰的清洗规则和实现一个健壮的递归函数,我们可以确保数据在后续处理前达到所需的质量标准。这种方法不仅适用于本例中的特定清洗规则,也为处理更复杂的数据结构和清洗逻辑提供了可扩展的基础。
以上就是PHP cURL获取与递归清理JSON数据教程的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号