我有以下 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 只保存了每个文件(rules1.txt、rules2.txt 等)需要从 $data['rules'] 中删除的 $data['rules'] 索引。
由于我对 PHP 耳熟能详,因此我尝试过的每种方法都失败了。正确的数据不是 unset() 或者在创建 $removeThese 时我错误地覆盖了我的数组。
寻找从 A 点(包含要删除的项目的原始 $data)到 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]);
}
}
}
}
}
大量的试验和错误,但唉,它的工作原理!我敢肯定,你们中的许多人本可以做得更好、更快。希望我能跟上速度。
现在我如何对自己的工作进行投票并接受自己的解决方案?!