我有以下PHP数组:
$data = Array
(
[rules1.txt] => Array
(
[rules] => Array
(
[0] => throw rule blah
[1] => punt rule blah
[2] => #comment
[3] =>
[4] => #punt rule that is commented out
)
[item] => rules1
[itemId] => 4
[new] => true
)
[rules2.txt] => Array
(
...
)
...
)
我关注的数组部分是$ data ['rules']及其键和值。阵列的这一部分具有不同数量的键,当然,值也会有所不同。
我要做的是“找到”以特定关键字开头的值,例如'throw'或'punt'...空白行(例如$ data ['rules'] [3])需要删除注释值(例如$ data ['rules'] [2]和... [4])。
因此,在我最终使用的任何循环中,我需要最终得到像......
这样的结构$data = Array
(
[rules1.txt] => Array
(
[rules] => Array
(
[0] => throw rule blah
[1] => punt rule blah
)
[item] => rules1
[itemId] => 4
[new] => true
)
[rules2.txt] => Array
(
...
)
...
)
在我努力实现目标的过程中,我创建了一个包含关键字的简单附加数组......
$actions = Array(
'throw',
'punt'
);
...用于循环创建第三个看起来像......的数组
$removeThese = Array
(
[rules1.txt] => Array
(
[0] => 2
[1] => 3
[2] => 4
)
[rules2.txt] => Array
(
...
)
...
)
上面的数组$ removeThese只保存$ data ['rules']索引,这些索引需要从$ data ['rules']中删除每个文件(rules1.txt,rules2.txt等)。
由于我在PHP的耳后湿了,我尝试了每种方法都失败了。正确的数据没有取消设置()或创建$ removeThese时我错误地覆盖了我的数组。
寻找建议最好从A点(原始$数据与要删除的项目)到B点(更新$ date,删除项目)。
非常感谢。
尝试了下面的代码似乎很接近但是$ removeThese被覆盖了...最终只有$ data的最后一个文件和$ data ['rules']的最后一个索引。
foreach ($data as $fileName => $fileData)
{
foreach ($fileData as $fdKey => $fdValue)
{
if ($fdKey === 'rules')
{
foreach ($fdValue as $key => $value)
{
foreach ($actions as $action)
{
if (strpos($value, $action) != 0)
{
if (!in_array($value, $removeThese[$fileName]))
{
$removeThese[$fileName][] = $key;
}
}
}
}
}
}
}
所以我看到两个问题:
1)我哪里出错导致$ removeThese被覆盖?
2)写这个更好的方法是什么?
我正在寻找的最终代码,我认为这不太糟糕 - 虽然我有很多需要学习的东西......
foreach ($data as $fileName => $fileData)
{
foreach ($fileData as $fdKey => $fdValue)
{
if ($fdKey === 'rules')
{
foreach ($fdValue as $key => $value)
{
$value = rtrim($value, "\n");
if (!in_array($value, $actions) === true)
{
unset($data[$fileName][$fdKey][$key]);
}
}
}
}
}
全部的试验和错误但是它有效!我相信很多人,你们中的许多人都可以做得更好,速度更快;希望我能加快速度。
现在我如何对自己的工作进行投票并接受我自己的解决方案?!
答案 0 :(得分:1)
我建议使用array_filter()。首先创建识别要忽略的值的函数:
function shouldIgnore($value) {
return !in_array($value, array('throw', 'punt'));
}
然后像这样过滤:
$data["rules1.txt"]["rules"] = array_filter($data["rules1.txt"]["rules"], "shouldIgnore");