PHP从多维数组中删除值

问题描述 投票:0回答:3

我有一个数组,$arr,看起来像这样:

'sdb5' => [
    'filters' => [
        (int) 11 => [
            'find' => [
                (int) 0 => (int) 569
            ],
            'exclude' => [
                (int) 0 => (int) 89,
                (int) 1 => (int) 573
            ]
        ],
        (int) 86 => [
            'find' => [
                (int) 0 => (int) 49,
                (int) 1 => (int) 522,
                (int) 2 => (int) 803
            ],
            'exclude' => [
                (int) 0 => (int) 530,
                (int) 1 => (int) 802,
                (int) 2 => (int) 511
            ]
        ]
    ]
],

我读过Delete element from multidimensional-array based on value,但我正在努力理解如何以有效的方式删除一个值。

例如,假设我要删除值522。我是这样做的:

 $remove = 522; // value to remove

 foreach ($arr as $filters) {
     foreach ($filters as $filter) {
         foreach ($filter as $single_filter) {
             foreach ($single_filter as $key => $value) {
                 if ($value == $remove) {
                     unset($key);
                 }
             }
          }
      }
  }

我无法从上面的链接中解决如何做到这一点,因为即使它是一个多维数组,它也没有像我一样的任何子数组。

我也不知道如何重写这个而不重复foreach来获取我想要的数组元素。我再次阅读Avoid multiple foreach loops但不能将其应用于我的阵列。

任何意见,将不胜感激。

使用PHP 7.x.

php arrays
3个回答
1
投票

foreach()制作了元素的副本。然后unseting键是不够的,因为你正在破坏一个局部变量。

您可以在&循环和foreach()中使用引用unset,如:

 foreach ($arr as &$filters) {
     foreach ($filters as &$filter) {
         foreach ($filter as &$single_filter) {
             foreach ($single_filter as $key => $value) {
                 if ($value == $remove) {
                     unset($single_filter[$key]);
                 }
             }
          }
      }
  }

或使用键($k1$k2,...):

 foreach ($arr as $k1 => $filters) {
     foreach ($filters as $k2 => $filter) {
         foreach ($filter as $k3 => $single_filter) {
             foreach ($single_filter as $key => $value) {
                 if ($value == $remove) {
                     unset($arr[$k1][$k2][$k3][$key]);
                 }
             }
          }
      }
  }

1
投票

您还可以编写递归函数,因此您不必使用嵌套的foreach

function deleteRecursive(&$array, &$value) {
  foreach($array as $key => &$subArray) {
    if(is_array($subArray)) {
      deleteRecursive($subArray, $value);
    } elseif($subArray == $value) {
      unset($array[$key]);
    }
  }
}

$valueToDelete = 522;

deleteRecursive($array, $valueToDelete);

0
投票
function recursiveRemoval(&$array, $val)
{
    if(is_array($array))
    {
        foreach($array as $key=>&$arrayElement)
        {
            if(is_array($arrayElement))
            {
                recursiveRemoval($arrayElement, $val);
            }
            else
            {
                if($arrayElement == $val)
                {
                    unset($array[$key]);
                }
            }
        }
    }
}

通话功能

recursiveRemoval($array, $value);
© www.soinside.com 2019 - 2024. All rights reserved.