如何从基于键和值的多维数组中删除值 - PHP

时间:2017-06-08 23:08:36

标签: php arrays multidimensional-array

如何从“pecan”中删除值“288”并返回更新的数组。

这样的数组:

a: 10: {
s: 13: "Fraser Island";
a: 7: {
    i: 0;
    i: 303;
    i: 1;
    i: 34;
    i: 2;
    i: 27;
    i: 3;
    i: 291;
    i: 4;
    i: 293;
    i: 5;
    i: 37;
    i: 6;
    i: 288;
}
s: 5: "pecan";
a: 5: {
    i: 0;
    i: 34;
    i: 1;
    i: 27;
    i: 2;
    i: 291;
    i: 3;
    i: 59;
    i: 4;
    i: 288;
}
s: 11: "New Triper";
a: 3: {
    i: 0;
    i: 291;
    i: 1;
    i: 293;
    i: 2;
    i: 288;
}

}

在PHP中将其翻译为:

Array ( 
[0] => Array ( 
    [Fraser Island] => Array ( 
        [0] => 303 
        [1] => 34 
        [2] => 27 
        [3] => 291 
        [4] => 293 
        [5] => 37 
        [6] => 288 
    )
    [pecan] => Array ( 
        [0] => 34 
        [1] => 27 
        [2] => 291 
        [3] => 59 
        [4] => 288 
    ) 
    [New Triper!] => Array ( 
        [0] => 291 
        [1] => 293 
        [2] => 288 
    )
)

通过查找数组列名称和值来从多维数组中删除/删除值。我使用这段代码:

// DELETE VALUE FROM ARRAY
function remove_element_by_value($arr, $val) {
    $return = array(); 
    foreach($arr as $k => $v) {
        if(is_array($v)) {
            $return[$k] = remove_element_by_value($v, $val); //recursion
            continue;
        }
        if($v == $val) continue;
            $return[$k] = $v;
        }
   return $return;
}

但是它会删除所有数组列中的所有匹配值。

4 个答案:

答案 0 :(得分:2)

因此,您知道自己正在查看pecan密钥,并且知道自己正在寻找288,因此只需搜索以返回密钥并unset()

$key = 'pecan';
$val = '288';

unset($array[0][$key][array_search($val, $array[0][$key])]);

重新索引:

$array[0][$key] = array_values($array[0][$key]);

或者解开它:

$found = array_search(288, $array[0]['pecan']);
unset($array[0]['pecan'][$found]);
$array[0]['pecan'] = array_values($array[0]['pecan']);

答案 1 :(得分:1)

尝试remove_element_by_value($arr, '288', 'pecan')

   // DELETE VALUE FROM ARRAY
    function remove_element_by_value($arr, $val, $keyToSearch) {
            $keyOfValue = array_search($val, $arr[0][$keyToSearch]);
            unset($arr[0][$keyToSearch][$keyOfValue]);
            $arr[0][$keyToSearch] = array_values($arr[0][$keyToSearch]); #Reindex
            return $arr;
    }

这样,您可以通过为元素提供要删除的键和值来删除元素,例如remove_element_by_value($arr, '288', 'Fraser Island') // remove 288 from Fraser Island

   // Code for PHPfiddle
function remove_element_by_value($arr, $val, $keyToSearch) {
        $keyOfValue = array_search($val, $arr[0][$keyToSearch]);
        unset($arr[0][$keyToSearch][$keyOfValue]);
        $arr[0][$keyToSearch] = array_values($arr[0][$keyToSearch]);
        return $arr;
}

$array = array(array('abc'=>array(1,2,3,4,5,6)));

print_r(remove_element_by_value($array, 2, 'abc'));

答案 2 :(得分:0)

// DELETE VALUE FROM ARRAY
function remove_element_by_value($arr, $key ,$val ) {
    $return = array(); 
    foreach($arr as $k => $v) {
        if(is_array($v)) {
            $return[$k] = remove_element_by_value($v, $val); //recursion
            continue;
        }
        if($v == $val && $k == $key) continue;
            $return[$k] = $v;
        }
   return $return;
}

答案 3 :(得分:0)

此功能将从特定的索引/关联数组中删除元素:

function removeElement($array, $value) {
  if(is_array($array)) {
    $key = array_search($value,$array);
       if(!isset($key)) {
         unset($array[$key]);
         return $array;    
       } 
  }
}

如果值与多维数组匹配,此函数将删除每个元素:

function removeElementMulti($array, $value) {
   if(is_array($array)) {
      foreach($array as $array_key => $simple_array) {
         $key = array_search($value,$simple_array);
         if(isset($key)) {
            unset($array[$array_key][$key]);
         }
      }

      return $array;  
   }
}