代码之家  ›  专栏  ›  技术社区  ›  Abu Ayyub

在php中从具有多个条件的json文件中删除项

  •  0
  • Abu Ayyub  · 技术社区  · 6 年前

    我有一个 文件.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\/"
      }
    ]
    

    如何在中删除具有多个条件的项 菲律宾比索 并归还其他物品 if:fileName=“product1.zip”&restoreDir=“Files/Archives1/”并再次保存到 文件.json

    预期结果 文件.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\/"
          }
        ]
    

    谢谢,

    1 回复  |  直到 6 年前
        1
  •  1
  •   Decent Dabbler    6 年前

    有一种方法可以做到这一点,即删除所有符合条件的项但是,如果你确定 与条件匹配的项,这是低效的,因为它评估 全部的 项目。

    如果你想要这个“简单”的版本,你应该循环 $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