从 Json 文件中删除具有 PHP 中多个条件的项目
Remove Item from Json File With multiple condition in PHP
我有一个 files.json,内容为:
[
{
"fileName": "product1.zip",
"fileSize": "5.08 KB",
"restoreDir": "Files\/Archives1\/"
},
{
"fileName": "product1.zip",
"fileSize": "1.39 MB",
"restoreDir": "Files\/Archives2\/"
},
{
"fileName": "product2.zip",
"fileSize": "1.38 MB",
"restoreDir": "Files\/Archives1\/"
},
{
"fileName": "product2.zip",
"fileSize": "1.37 MB",
"restoreDir": "Files\/Archives2\/"
}
]
如何删除 PHP 和 return 其他项目中具有多个条件的项目
if: fileName = "product1.zip" & restoreDir = "Files/Archives1/" 并再次保存到 files.json
files.json的预期结果:
[
{
"fileName": "product1.zip",
"fileSize": "1.39 MB",
"restoreDir": "Files\/Archives2\/"
},
{
"fileName": "product2.zip",
"fileSize": "1.38 MB",
"restoreDir": "Files\/Archives1\/"
},
{
"fileName": "product2.zip",
"fileSize": "1.37 MB",
"restoreDir": "Files\/Archives2\/"
}
]
谢谢,
这是一种方法,可以删除所有符合条件的项目。但是,如果您确定永远只有 one 项符合条件,那么这是低效的,因为它会评估 all 项。
如果你想要这个 "simpler" 版本,你应该循环遍历 $decoded
(使用 for( ; ; )
或 foreach()
),一旦满足条件,从数组中删除项目并 break
退出循环。
$json = <<<'JSON'
[
{
"fileName": "product1.zip",
"fileSize": "5.08 KB",
"restoreDir": "Files\/Archives1\/"
},
{
"fileName": "product1.zip",
"fileSize": "1.39 MB",
"restoreDir": "Files\/Archives2\/"
},
{
"fileName": "product2.zip",
"fileSize": "1.38 MB",
"restoreDir": "Files\/Archives1\/"
},
{
"fileName": "product2.zip",
"fileSize": "1.37 MB",
"restoreDir": "Files\/Archives2\/"
}
]
JSON;
$criteria = [
'fileName' => 'product1.zip',
'restoreDir' => 'Files/Archives1/'
];
$decoded = json_decode( $json, true );
$filtered = array_filter( $decoded, function( $item ) use ( $criteria ) {
return array_intersect_assoc( $criteria, $item ) !== $criteria;
} );
$result = json_encode( $filtered, JSON_PRETTY_PRINT );
var_dump( $result );
我有一个 files.json,内容为:
[
{
"fileName": "product1.zip",
"fileSize": "5.08 KB",
"restoreDir": "Files\/Archives1\/"
},
{
"fileName": "product1.zip",
"fileSize": "1.39 MB",
"restoreDir": "Files\/Archives2\/"
},
{
"fileName": "product2.zip",
"fileSize": "1.38 MB",
"restoreDir": "Files\/Archives1\/"
},
{
"fileName": "product2.zip",
"fileSize": "1.37 MB",
"restoreDir": "Files\/Archives2\/"
}
]
如何删除 PHP 和 return 其他项目中具有多个条件的项目 if: fileName = "product1.zip" & restoreDir = "Files/Archives1/" 并再次保存到 files.json
files.json的预期结果:
[
{
"fileName": "product1.zip",
"fileSize": "1.39 MB",
"restoreDir": "Files\/Archives2\/"
},
{
"fileName": "product2.zip",
"fileSize": "1.38 MB",
"restoreDir": "Files\/Archives1\/"
},
{
"fileName": "product2.zip",
"fileSize": "1.37 MB",
"restoreDir": "Files\/Archives2\/"
}
]
谢谢,
这是一种方法,可以删除所有符合条件的项目。但是,如果您确定永远只有 one 项符合条件,那么这是低效的,因为它会评估 all 项。
如果你想要这个 "simpler" 版本,你应该循环遍历 $decoded
(使用 for( ; ; )
或 foreach()
),一旦满足条件,从数组中删除项目并 break
退出循环。
$json = <<<'JSON'
[
{
"fileName": "product1.zip",
"fileSize": "5.08 KB",
"restoreDir": "Files\/Archives1\/"
},
{
"fileName": "product1.zip",
"fileSize": "1.39 MB",
"restoreDir": "Files\/Archives2\/"
},
{
"fileName": "product2.zip",
"fileSize": "1.38 MB",
"restoreDir": "Files\/Archives1\/"
},
{
"fileName": "product2.zip",
"fileSize": "1.37 MB",
"restoreDir": "Files\/Archives2\/"
}
]
JSON;
$criteria = [
'fileName' => 'product1.zip',
'restoreDir' => 'Files/Archives1/'
];
$decoded = json_decode( $json, true );
$filtered = array_filter( $decoded, function( $item ) use ( $criteria ) {
return array_intersect_assoc( $criteria, $item ) !== $criteria;
} );
$result = json_encode( $filtered, JSON_PRETTY_PRINT );
var_dump( $result );