从多维数组中删除每个元素,其中第二个键等于一个变量

时间:2019-01-12 02:00:23

标签: php arrays

让我们按压力,我在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>

1 个答案:

答案 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 ) 
)

Demo on 3v4l.org