在导出数据期间,我可以在CSV和JSON格式之间进行选择。查看CSV,数据(包括列名)的排列方式与我想要导入MySQL数据库的方式完全相同。
我从网页中获得JSON,它存储在$data变量中。
<html>
<body>
<?php
// Include Parsehub REST api wrapper
require_once __DIR__ . '/vendor/autoload.php';
use Parsehub\Parsehub;
$api_key = "XXX";
$project_token = "XXX";
$parsehub = new Parsehub($api_key);
$data = $parsehub->getLastReadyRunData($project_token);
echo $data;
?>
</body>
</html>它的回波输出将返回JSON:https://pastebin.com/raw/AZt4gvsC
创建表:
CREATE TABLE `utakmice_1` (
`utakmica_name` varchar(64) NOT NULL,
`utakmica_url` varchar(256) NOT NULL,
`utakmica_liga` varchar(64) NOT NULL,
`utakmica_liga_url` varchar(256) NOT NULL,
`utakmica_vreme` varchar(64) NOT NULL,
`utakmica_datum` varchar(64) NOT NULL,
`utakmica_kvote_kvota` decimal(10,2) NOT NULL,
`utakmica_kvote_kladionica` varchar(63) NOT NULL,
`utakmica_kvote_kladionica_url` varchar(256) NOT NULL,
`utakmica_kvote_igra` varchar(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;以哪种方式可以插入所有的json数据?
发布于 2022-03-21 17:49:22
使用PHP,您需要:
使用解码将JSON数据转换为关联数组
$data = json_decode($jsondata, true);处理该数组以获取需要在表中插入的数据。
$name = $data['utakmica']['name'];
$url = $data['utakmica']['age'];
etc使用Insert查询插入到MySQL (这里使用米斯里,但可以使用PDO)
$sql = "INSERT INTO utakmice_1(utakmica_name, utakmica_url)
VALUES('$name', '$url')";
if(!mysqli_query($con, $sql))
{
die('Error : ' . mysql_error());
}发布于 2022-03-22 00:41:55
给定CSV显示和JSON中的结构,当对JSON结构执行标准递归迭代时,通过修改终止leaf是不再包含数组属性的对象时,就可以遍历所有叶节点的属性名,其属性名以所有父属性名称(删除数组索引)为前缀,并使用所有较低深度的当前对象(来自子迭代器)进行深度升序,以便创建一个合并对象以获得具有这些键的对象。
它的样板是RecursiveArrayIterator和RecursiveIteratorIterator.
重要的是,如果一个对象有一个属性是一个数组,它是唯一的属性是一个数组,而这个数组是一个对象的数组,这些对象都是同构的。这是JSON文本的情况,这一点很重要,因为需要修改RecursiveArrayIterator和RecursiveIteratorIterator来进行这种遍历。
未经修改的样板行为也在相关的Q&A 如何使用PHP解析JSON文件?中显示。
$it = new RecursiveIteratorIterator(
new RecursiveArrayIterator($json)
);
foreach ($it as $property => $value) {
...
}在用例中,这两个对象都需要修改,而且它只适用于只对叶进行迭代(因为只有在合并对象时才有意义),整个构造可以从RecursiveIteratorIterator,覆盖直接接受$json的构造函数扩展,使用RecursiveArrayIterator.的修改。
说到这里,它需要保留键前缀(此处实现为私有属性),将对象转换为不可遍历的子对象(标准行为是每个非对象和非数组属性构造一个叶),并从每个节点中删除数组属性,因为这些属性只用于遍历叶节点,然后在整个路径上按深度升序合并时,它们将是多余的:
$it = new class ($json) extends \RecursiveIteratorIterator {
public function __construct(object $json)
{
$jsonObjectRecursion = new class($json) extends \RecursiveArrayIterator
{
private ?string $keyPrefix = null;
public function key()
{
return (null !== $this->keyPrefix ? $this->keyPrefix . '_' : '') . parent::key();
}
public function current(): object|array
{
$current = parent::current();
if (is_array($current)) {
return $current;
}
$current = array_filter(get_object_vars($current), static fn ($any) => !is_array($any));
if (null !== $this->keyPrefix) {
$current = array_combine(preg_filter('/^/', "{$this->keyPrefix}_", array_keys($current)), $current);
}
return (object)$current;
}
public function hasChildren(): bool
{
$current = parent::current();
if (is_array($current)) {
return parent::hasChildren();
}
return (is_object($current) && array_filter(get_object_vars($current), 'is_array'));
}
public function getChildren(): self
{
$current = parent::current();
if (is_array($current)) {
$children = parent::getChildren();
$children->keyPrefix = $this->key();
return $children;
}
$probe = array_filter(get_object_vars($current), 'is_array');
$children = new self((object) [key($probe) => current($probe)]);
$children->keyPrefix = $this->keyPrefix;
return $children;
}
};
parent::__construct($jsonObjectRecursion);
}
...如本节选所示,数组遍历被保留,密钥前缀也随之传递。也许可以删除current()中的数组处理,因为数组只有在has/getChildren()调用时才能起作用。
$json只是一个大的JSON对象,它被解码为PHP的stdClass。尽管RecursiveArrayIterator的名称中包含数组,但它可以很好地处理这些JSON对象,而无需将它们转换为数组。
在仅定义内部迭代器的构造函数旁边,此RecursiveIteratorITerator只实现第二个方法current(),它执行合并:
...
public function current(): object
{
$object = [];
for ($depth = 0; $depth <= $this->getDepth(); $depth++) {
$current = $this->getSubIterator($depth)->current();
if (is_array($current)) {
continue;
}
$object += get_object_vars($current);
}
return (object)$object;
}
};正如现在定义的$it一样,所需要的就是遍历它并继续执行以下值:
foreach ($it as $row) {
echo json_encode($row, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES), "\n";
break;
}输出(第一行):
{
"utakmica_name": "Deportivo Kuenka-Un. Katolika Kito",
"utakmica_url": "https://www.fudbal91.com/soccer_clubs/compare/Deportivo_Cuenca_vs_Un._Catolica_Quito/13641",
"utakmica_liga": "Ekvador 1",
"utakmica_liga_url": "https://www.fudbal91.com/competition/Ecuador,_LigaPro_betcris_-_Primera_Etapa/2022",
"utakmica_vreme": "00:00",
"utakmica_datum": "< 22.03.2022. (Utorak) >",
"utakmica_kvote_kvota": "2.75",
"utakmica_kvote_kladionica": "BetOle",
"utakmica_kvote_kladionica_url": "https://example.com/2YjM4Ft",
"utakmica_kvote_igra": "1"
}若要将$it转换为对象数组,请使用iterator_to_array($it, false)。当您期待按照一个属性对整个列表进行排序时,不需要每次操作都需要遍历整棵树。
就像--如果你已经使用了CSV导出,那么它已经是平坦的了。
这样的,甚至更多的提示可以在相关的Q&A 如何使用PHP从JSON中提取和访问数据?和更多的其他网站上找到。
https://stackoverflow.com/questions/71560704
复制相似问题