让我们按压力,我在php中有以下数组:
Array (
0 => Array(
1 => 1,
4 => 1
),
1 => Array(
0 => 1,
2 => 1,
5 => 1
),
2 => Array(
1 => 1,
6 => 1
)
)
是否有任何内置的php函数,可以从此数组子数组(键为1)中删除每个元素?我需要的结果数组如下所示:
Array (
0 => Array(
4 => 1
),
1 => Array(
0 => 1,
2 => 1,
5 => 1
),
2 => Array(
6 => 1
)
)
我知道这可以通过foreach
循环来实现,但是我正在寻找一种衬垫函数(如果有的话)。在性能方面,如果可能的话,我想避免使用foreach。此功能将运行〜2.000.000次。
用例:这种用例是为Dijkstra
算法构建图形,以便在不执行对角线移动的3x3网格上进行寻路,而且每一步的成本都一样。我在想,通过用每个可能的移动预先填充运动图,然后删除所有有障碍的路径,会更快,然后根据障碍将图填充为零,这样会更快。
这是到目前为止我用来填充图形的代码:
$graph = array();
foreach (self::$dijkstraPathCycle as $i => $possibleMoves) {
$graph[$i] = array();
foreach ($possibleMoves as $pos) {
if ($this->getMonsterOnPosition($pos) !== false) continue;
$graph[$i][self::dijkstraConvertPosToInt($pos)] = 1;
}
}
self::$dijkstraPathCycle
是一个数组,其中包含来自所有可能位置的所有可能移动。如果位置为空,则$this->getMonsterOnPosition()
返回false,因此它可以移动到; self::dijkstraConvertPosToInt()
除了将类似数组array(x,y)
作为位置之外,并使用按位运算符将其转换为整数。 / p>
答案 0 :(得分:0)
您可以使用array_map
来迭代数组,使用array_filter
移除键为1
的元素。
$array2 = array_map(function ($v) {
return array_filter($v, function ($k) {
return $k != 1;
}, ARRAY_FILTER_USE_KEY);
},
$array);
print_r($array2);
使用简单的foreach循环可能会更快:
foreach ($array as &$arr) {
if (isset($arr[1])) unset($arr[1]);
}
输出(两种情况):
Array (
[0] => Array ( [4] => 1 )
[1] => Array ( [0] => 1 [2] => 1 [5] => 1 )
[2] => Array ( [6] => 1 )
)