【问题标题】:Array_Diff is deleting only the key/value from the array of objects but not the whole objectArray_Diff 仅从对象数组中删除键/值,而不是整个对象
【发布时间】:2020-08-22 04:49:43
【问题描述】:

我有一个最终生成 JSON 数组的脚本。生成 JSON 数组可以正常工作,但在搜索特定键值时我似乎无法从对象数组中删除整个对象。

生成数组:

$sql="SELECT * FROM `emails` WHERE `subject` LIKE '%5678%' order by `id` DESC LIMIT 50";
$result = mysqli_query($DatabasePointer2,$sql) or die(mysqli_error($DatabasePointer2));
$row_cnt = mysqli_num_rows($result); 
if($row_cnt>0) {
    $array = array();
    $i=0;
    while($row = mysqli_fetch_array($result)) {
        $i++;
        $a1 = explode('-', $row['body']);
        $a1[0] = str_replace("","",$a1[0]);
        $a1[1] = str_replace("TF: ","",$a1[1]);
        $a1[1] = str_replace("minutes","M",$a1[1]); 
        $a = array(
            "p" => "test", 
            "id" => $row['id'], 
            "thekey" => $a1[1], 
            "time" => $dt->format('Y-m-d H:i:s'), 
            "utctime" => strtotime($dt->format('Y-m-d H:i:s')), 
            "utc2" =>  $two->format('Y-m-d H:i:s'), 
            "utc3" =>  $three->format('Y-m-d H:i:s')
            );
        $a1 = array_diff($a, ["keytoexclude1", "keytoexclude2", "keytoexclude3"]);

        $array[] = $a1;
    }       
}
echo json_encode($array, JSON_UNESCAPED_SLASHES);

注意thekey 的值不是静态的。

上面的代码产生了这个:

[{
    "p": "test",
    "id": "198645",
    "time": "2020-05-06 23:00:49",
    "utctime": 1588806049,
    "utc2": "2020-05-07 01:00:49",
    "utc3": "2020-05-07 02:00:49"
}, {
    "p": "test",
    "id": "198605",
    "time": "2020-05-06 22:00:55",
    "utctime": 1588802455,
    "utc2": "2020-05-07 00:00:55",
    "utc3": "2020-05-07 01:00:55",
    "thekey": "123456"
}, {
    "p": "test",
    "id": "198604",
    "time": "2020-05-06 22:00:54",
    "utctime": 1588802454,
    "utc2": "2020-05-07 00:00:54",
    "utc3": "2020-05-07 01:00:54"
}]

我想要完成的是搜索与排除列表匹配的任何键,然后如果它在排除列表中找到一个键,则删除整个对象。

排除列表/要删除的代码...

$a1 = array_diff($a, ["keytoexclude1", "keytoexclude2", "keytoexclude3"]);

发生了什么,它只是删除了键/值本身,但保留了对象的其余部分。 如果您查看上面的数组,您会发现如果找到排除项,它只会从对象中删除“thekey”及其值,而将其余键留在对象中。

有人可以帮忙移除整个对象吗?

**已更新以显示错误,其中“thekey”的值不应来自 mysql 数据库,而是来自爆炸的数组。

【问题讨论】:

  • $a 是一维关联数组。但是你展示了一个二维数组,它是从哪里来的?
  • array_diff() 作用于值,而不是键。而且它不会在嵌套数组中查找。
  • array_diff_key() 比较键,但两个数组必须是关联的。
  • 我真的不知道你想排除什么。但我怀疑你要找的是array_filter()
  • 让我再添加一点代码。从 mysql 数据库读取数据后,$a 在 while 循环内。

标签: php arrays json object


【解决方案1】:

使用if 语句检查该值是否在排除列表中,并跳过该行。

    while($row = mysqli_fetch_array($result)) {
        if (in_array($row['thevalue'], ["keytoexclude1", "keytoexclude2", "keytoexclude3"])) {
            continue;
        }
        $a = array(
            "p" => "test", 
            "id" => $row['id'], 
            "thekey" => $row['thevalue'], 
            "time" => $dt->format('Y-m-d H:i:s'), 
            "utctime" => strtotime($dt->format('Y-m-d H:i:s')), 
            "utc2" =>  $two->format('Y-m-d H:i:s'), 
            "utc3" =>  $three->format('Y-m-d H:i:s')
            );
        $array[] = $a1;
    }       

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2019-01-08
    • 2022-07-02
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多