【问题标题】:Return all array elements except for a given key返回除给定键之外的所有数组元素
【发布时间】:2011-07-06 02:00:32
【问题描述】:

简单的一个,我只是想知道是否有一种干净而雄辩的方法可以从关联数组中返回与给定键不匹配的所有值?

$array = array('alpha' => 'apple', 'beta' => 'banana', 'gamma' => 'guava');

$alphaAndGamma = arrayExclude($array, array('alpha'));
$onlyBeta      = arrayExclude($array, array('alpha', 'gamma'));

function arrayExclude($array, Array $excludeKeys){
    foreach($array as $key => $value){
        if(!in_array($key, $excludeKeys)){
            $return[$key] = $value;
        }
    }
    return $return;
}

这是我(将要)使用的,但是,是否有更简洁的实现,我可能在手册中遗漏了什么?

【问题讨论】:

  • 您是否有可能在 $excludeArray 中包含您正在迭代的数组中不存在的值?
  • 在 laravel 你可以使用 Arr::except($array , [ 'sdf' , 'sdf' ]) 或者如果请求 $request->except([ 'sdf' , 'sdf' ])

标签: php associative-array


【解决方案1】:

虽然,这个问题太老了,有几个答案可以解决这个问题,但我发布了一个可能对某人有用的解决方案。

您可以从提供的输入中获取所有数组元素,除了您定义要排除的某些键:

$result = array_diff_key($input, array_flip(["SomeKey1", "SomeKey2", "SomeKey3"]));

这将从$input 数组中排除具有键SomeKey1SomeKey2SomeKey3 的元素,并将所有其他元素返回到$result 变量中。

【讨论】:

  • 简洁明了,回答简短甜美
【解决方案2】:

你可以只unset这个值:

$alphaAndGamma = $array;
unset($alphaAndGamma['alpha']);

编辑:使其更清晰。您可以通过将数组分配给另一个变量来复制它。

或在函数中:

function arrayExclude($array, Array $excludeKeys){
    foreach($excludeKeys as $key){
        unset($array[$key]);
    }
    return $array;
}

【讨论】:

  • 谢谢 Felix Kling;是的,但是这会修改原始数组。
  • @TomcatExodus:是的,但是您可以在之前将数组分配给其他变量并取消设置该变量的值。赋值复制数组。
  • 我不想听起来很古怪,但您的解决方案来自源数组unsets。 OP 想要从函数返回的没有这个和那个键的数组。不过,+1 是显而易见的解决方案。
  • @TomcatExodus,所以先复制它 - $alphaAndGamma = $array; unset($alphaAndGamma['alpha']);
  • @TomcatExodus, @dmcnelis: 刚测试过,不会抛出通知。因此,无需进行测试。
【解决方案3】:

使用array_diff_key():

$array = array('alpha' => 'apple', 'beta' => 'banana', 'gamma' => 'guava');

$alphaAndGamma = array_diff_key($array, array('alpha'=>0));
$onlyBeta      = array_diff_key($array, array('alpha'=>0, 'gamma'=>0));

编辑:我添加了 =>0s。

【讨论】:

  • 你必须以不同的方式创建第二个数组。你必须使用array_flip(array('alpha'))。但是很好的方法+1。比我的更优雅,但考虑到所有功能,不一定更快……但这需要测试。
  • 哦,还有第二点:这只有在所有必须取消设置的键也都在数组中时才有效。但我们没有足够的信息。
  • @Felix Kling。其实,你错了。请参阅文档中的示例:php.net/manual/en/function.array-diff-key.php
  • @linepogl:是的,对不起。有时 PHP 函数的工作方式与您对它们的名称所期望的略有不同。如果可以的话,我会投票给你两次。
  • 感谢 linepogl;我必须将其与 Felix 的基准进行对比。
【解决方案4】:
$alphaAndGamma = $array;
unset($alphaAndGamma['alpha']);

$onlyBeta = $array;
unset($onlyBeta['alpha'], $onlyBeta['gamma']);

【讨论】:

    【解决方案5】:

    这里的简单函数,使用两个数组,实际数组和应排除的键数组。如果我们排除这个功能,也可以很容易地做成一个衬里。

    function array_except(array $array,array $except) {
    
     return array_filter($array,fn($key) => !in_array($key,$except),ARRAY_FILTER_USE_KEY);
    
    }
    

    【讨论】:

      【解决方案6】:

      有一些关于使用 in_array 时的速度的讨论。从我读过的内容来看,包括这条评论1,使用 isset 比 in_array 更快。

      在这种情况下,您的代码将是:

      function arrayExclude($array, array $excludeKeys){
      
          $return = [];
      
          foreach($array as $key => $value){
              if(!isset($excludeKeys[$key])){
                  $return[$key] = $value;
              }
          }
          return $return;
      }
      

      这会稍微快一些,并且在您需要处理大型数据集时可能会有所帮助。

      【讨论】:

        【解决方案7】:

        您可以使用此键轻松删除数组项。

        unset($array['key']); 
        

        演示 http://codepad.org/EA9vTwzR

        【讨论】:

          【解决方案8】:

          如果你想要 Laravel 方式,Arr::except 方法会从数组中删除给定的键/值对:

          use Illuminate\Support\Arr;
          
          $array = ['name' => 'Desk', 'price' => 100];
          
          $filtered = Arr::except($array, ['price']);
          
          // ['name' => 'Desk']
          

          @sourcehttps://laravel.com/docs/8.x/helpers#method-array-except

          【讨论】:

            【解决方案9】:

            array_diff_assoc 可以提供帮助。所以你可以使用

            $onlyBeta = array_diff_assoc($array, array('alpha', 'gamma'))
            

            【讨论】:

            • 哦,对了。我混淆了这两个函数(array_diff_assoc 和 array_diff_key)。
            猜你喜欢
            • 1970-01-01
            • 2017-03-13
            • 1970-01-01
            • 1970-01-01
            • 2016-08-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多