在开始之前,我正在学习,我不会声称自己是PHP专家。我尝试过几种不同的东西,但这种方法让我最接近我想要的东西。
我有一个我想要搜索的JSON数组,如果文本的一部分与数组中的一行(Alerts)匹配,则从数组中删除整个键。 (如果可能的话,我只想让它匹配最新的密钥,而不是删除所有匹配的密钥)
以下代码正在处理数组中的最新项目,但无法搜索较旧的记录。
例如,
[8] => Array
(
[Code] => 9
[Alerts] => bob went away
)
[9] => Array
(
[Code] => 9
[Alerts] => randy jumped in the air
)
)
如果我调用脚本,使用'bob'一词,它什么也找不到。如果我用“randy”一词调用脚本,它将完全删除键9.我可以搜索“bob”一词,它将删除键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;
}
再次感谢!
答案 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));