多维数组搜索单词或短语的一部分并删除键

时间:2018-05-20 06:59:17

标签: php arrays json search

在开始之前,我正在学习,我不会声称自己是PHP专家。我尝试过几种不同的东西,但这种方法让我最接近我想要的东西。

我有一个我想要搜索的JSON数组,如果文本的一部分与数组中的一行(Alerts)匹配,则从数组中删除整个键。 (如果可能的话,我只想让它匹配最新的密钥,而不是删除所有匹配的密钥)

以下代码正在处理数组中的最新项目,但无法搜索较旧的记录。

例如,

[8] => Array
       (
           [Code] => 9
           [Alerts] => bob went away
       )

   [9] => Array
       (
           [Code] => 9
           [Alerts] => randy jumped in the air
       )

)

如果我调用脚本,使用'bob'一词,它什么也找不到。如果我用“randy”一词调用脚本,它将完全删除键9.我可以搜索“b​​ob”一词,它将删除键8。

这是我到目前为止所拥有的。 (同样可能有更好的方法)

<?php   
$jsondata = file_get_contents('myfile.json');
$json = json_decode($jsondata, true);
$done = 'term';
$pattern = preg_quote($done, '/');
$pattern = "/^.*$pattern.*\$/m";
$arr_index = array();
foreach ($json as $key => $value)
    $contents = $value['Alerts'];
{
    if(preg_match($pattern, $contents, $matches))
    {
        $trial = implode($matches);
    }
    if ($contents == $trial)
    {
        $arr_index[] = $key;
    }
}
foreach ($arr_index as $i)
{
    unset($json[$i]);
}
$json = array_values($json);
file_put_contents('myfile-test.json', json_encode($json));
echo $trial; //What did our search come up with?
die;
}

再次感谢!

2 个答案:

答案 0 :(得分:1)

问题是使用$contents的代码不在foreach循环内。循环在其正文中只有一个语句:

$contents = $value['Alerts'];

当循环结束时,$contents包含最后一个警报值,然后在代码块之后使用它。

您需要将该语句放在大括号内。

<?php   
$jsondata = file_get_contents('myfile.json');
$json = json_decode($jsondata, true);
$done = 'term';
$pattern = preg_quote($done, '/');
$pattern = "/^.*$pattern.*\$/m";
$arr_index = array();
foreach ($json as $key => $value)
{
    $contents = $value['Alerts'];
    if(preg_match($pattern, $contents, $matches))
    {
        $trial = implode($matches);
    }
    if ($contents == $trial)
    {
        $arr_index[] = $key;
    }
}
foreach ($arr_index as $i)
{
    unset($json[$i]);
}
$json = array_values($json);
file_put_contents('myfile-test.json', json_encode($json));
echo $trial; //What did our search come up with?
die;
}

您应该使用编辑器的功能自动缩进代码,这样会使问题变得更加明显。

答案 1 :(得分:0)

如果有人需要,我实际上可以通过使用以下内容来实现它。它比我最初想要的更简单一些。这将停止在找到文本的第一个键上。要删除所有记录,只需删除“中断”,它将删除包含所述文本或短语的所有密钥。

$pattern = preg_quote($done, '/');
$pattern = "/^.*$pattern.*\$/m";
$arr_index = array();
foreach ($json as $key => $contents) 
{
    if(preg_match($pattern, $contents['Alerts'], $matches)) {
      unset($json[$key]);
      break; 
   }
}
$json = array_values($json);

file_put_contents('myfile-test.json', json_encode($json));