从 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 );

view parsed online @ eval.in