PHP删除数组中的数组

PHP删除数组中的数组,php,arrays,json,Php,Arrays,Json,我试图打开一个.json文件,并检查该文件是否包含由其键标识的数组。如果是这样,我想删除它并将文件写回服务器。但是,我没有任何运气,我认为这是我对PHP中数组数组的误解: PHP: $song_id = "j8sUV-ykOB"; $file = "file.json"; $song_list = json_decode(file_get_contents($file),true); foreach($song_list as $song){ if(in_array($song_id,$s

我试图打开一个.json文件,并检查该文件是否包含由其键标识的数组。如果是这样,我想删除它并将文件写回服务器。但是,我没有任何运气,我认为这是我对PHP中数组数组的误解:

PHP:

$song_id = "j8sUV-ykOB";
$file = "file.json";
$song_list = json_decode(file_get_contents($file),true);

foreach($song_list as $song){
  if(in_array($song_id,$song_list)){
    unset($song);   
    file_put_contents($file,json_encode($song_list,JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT));          
  } 
}
{
    "uKrb3eNCf": [
        "Thunder Rolls",
        "c"
    ],
    "kdOzCKjKN-": [
        "Turn the Page",
        "a"
    ],
    "bDreHgZgxF": [
        "Wild Nights",
        "a"
    ],
    "oeNcwqZJS": [
        "Every day is a winding road",
        "b,j"
    ],
    "j8sUV-ykOB": [
        "Testin",
        "b"
    ]
}
file.json:

$song_id = "j8sUV-ykOB";
$file = "file.json";
$song_list = json_decode(file_get_contents($file),true);

foreach($song_list as $song){
  if(in_array($song_id,$song_list)){
    unset($song);   
    file_put_contents($file,json_encode($song_list,JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT));          
  } 
}
{
    "uKrb3eNCf": [
        "Thunder Rolls",
        "c"
    ],
    "kdOzCKjKN-": [
        "Turn the Page",
        "a"
    ],
    "bDreHgZgxF": [
        "Wild Nights",
        "a"
    ],
    "oeNcwqZJS": [
        "Every day is a winding road",
        "b,j"
    ],
    "j8sUV-ykOB": [
        "Testin",
        "b"
    ]
}

您需要的是
取消设置
$song\u列表[$key]
,而不是
$song
变量:

foreach($song_list as $key => $song){
  if(in_array($song_id,$song_list)){
    unset($song_list[$key]);          
  } 
}
file_put_contents($file,json_encode($song_list,JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT));

代码中的
$song
变量包含json文件中当前元素的值,对该值执行
unset
没有任何意义。

您想要的是
unset
设置
$song\u列表[$key]
,而不是
$song
变量:

foreach($song_list as $key => $song){
  if(in_array($song_id,$song_list)){
    unset($song_list[$key]);          
  } 
}
file_put_contents($file,json_encode($song_list,JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT));

代码中的
$song
变量包含json文件中当前元素的值,对该值执行
unset
没有任何意义。

在您的情况下,由于数据的结构方式,您可以避免for循环,我们可以直接调用
$song\u列表
数组中的特定数据数组

您的歌曲ID是键,因此您可以直接检查该键是否存在于您的歌曲列表数组中,如果确实存在,请取消设置该键

这就是它的实际作用:

<?php
$song_id = "j8sUV-ykOB";
$file = "file.json";
$song_list = json_decode(file_get_contents($file),true);

if (array_key_exists($song_id, $song_list))
{
    unset($song_list[$song_id]);    
    file_put_contents($file,json_encode($song_list,JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT));
}

在您的情况下,由于数据的结构方式,您可以避免for循环,我们可以直接调用
$song_list
数组中的特定数据数组

您的歌曲ID是键,因此您可以直接检查该键是否存在于您的歌曲列表数组中,如果确实存在,请取消设置该键

这就是它的实际作用:

<?php
$song_id = "j8sUV-ykOB";
$file = "file.json";
$song_list = json_decode(file_get_contents($file),true);

if (array_key_exists($song_id, $song_list))
{
    unset($song_list[$song_id]);    
    file_put_contents($file,json_encode($song_list,JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT));
}

这个代码对我来说是成功的。在foreach检查中,$song_id是否等于数组的键。如果没有,请在新数组中插入此数组。所以,在完成所有foreach循环之后,将创建新的数组。所以,在解码这个新数组之后,再次编写json文件。谢谢




这个代码对我来说是成功的。在foreach检查中,$song_id是否等于数组的键。如果没有,请在新数组中插入此数组。所以,在完成所有foreach循环之后,将创建新的数组。所以,在解码这个新数组之后,再次编写json文件。谢谢

我投票将此问题作为离题题结束,因为您首先应该尝试自己完成任务。您的错误是什么?@MarcinOrlowski提供的代码是OP的尝试。我投票将此问题作为离题结束,因为您首先应该尝试自己完成任务。您的错误是什么?..@MarcinOrlowski提供的代码是OP的尝试。OP解释一下为什么取消$song不起作用,而不仅仅是提供正确的answer@Aknosis多次编辑,错过了一次:)谢谢你注意到这一点。现在添加。更仔细地阅读,没有任何理由在循环内进行数组内检查。这可以在循环之外完成,但实际上根本不需要使用foreach构造执行(使用迭代代码),因为我们可以使用
song\u id
直接引用密钥,所以不需要在这个问题中使用foreach构造。使用
数组\u键\u exists
检查更有效。这里的代码对foreach中的数组进行了完整的检查,然后在foreach中使用
in_array
函数进行了相同的检查,因此此检查为O(n)^2,而
数组的键存在
检查为O(n),但几乎为O(1)因为它不会遍历每一个对象。与其提供正确的方法,不如解释为什么unsetting$song不起作用answer@Aknosis多次编辑,错过了一次:)谢谢你注意到这一点。现在添加。更仔细地阅读,没有任何理由在循环内进行数组内检查。这可以在循环之外完成,但实际上根本不需要使用foreach构造执行(使用迭代代码),因为我们可以使用
song\u id
直接引用密钥,所以不需要在这个问题中使用foreach构造。使用
数组\u键\u exists
检查更有效。这里的代码对foreach中的数组进行了完整的检查,然后在foreach中使用
in_array
函数进行了相同的检查,因此此检查为O(n)^2,而
数组的键存在
检查为O(n),但几乎为O(1)由于它不会遍历每一个对象。
file\u put\u contents()
是否应该放在
if
语句中?@TripleC您是非常正确的,它应该,我将进行编辑以反映这一点。
file\u put\u contents()
是否应该放在
if
语句中?@TripleC您是非常正确的,它应该,我将进行编辑以反映这一点。如果每个数组都有一个我们知道并可以直接调用的唯一键,则无需遍历每个索引。如果每个数组都有一个我们知道并可以直接调用的唯一键,则无需遍历每个索引。