从条件中删除关联数组中的特定键

时间:2013-12-14 22:17:47

标签: php arrays associative-array

我遇到了编码情况,我宁愿保持一个尽可能紧凑的条件:

// $data and $control are arrays
if($data==$control || ($someBool && $data==$control))
    return $c;

当然,这种情况没有任何意义。我的目标是在将$control$data进行比较之前,从function chopByKey(array $arr, $key){ if(!isset($arr[$key])) return $arr; unset($arr[$key]); return $arr; } 中移除一个密钥。

当然可以这样做:

if($data==$control || ($someBool && $data==chopByKey($control, 'someKey') ))
    return $c;

重写条件:

{{1}}

请注意

我正在寻找一种我可以在我的条件下使用的解决方案,而不是任何需要任何额外步骤提前条件或自定义函数定义的解决方案,无论是否匿名。

我的问题是

在没有定义新的自定义函数的情况下,还有更优雅的方法吗?

如果是,怎么样?

4 个答案:

答案 0 :(得分:4)

我想出了以下一行:

$control = array('hello' => 'world', 'foo' => 'bar');
$data = array('hello' => 'world');
$someBool = true;

if ($data == $control || $someBool && $data == array_diff_key($control, array('foo' => 0))) {

副作用是条件不会修改$control

答案 1 :(得分:1)

我要做的是:

$checkControl = $control;
if ($someBool) unset($checkControl['somekey']);

if ($checkControl == $data) {

它需要2个额外的行,但整体非常易读。

但它并没有真正回答你的问题......如果你想要一行,你可能想检查一下array_diff_assoc()

$diff = array_diff_assoc($control, $data);
if (!$diff || ($someBool && array_keys($diff) == array('somekey'))) {

它的可读性不高,可能效率不高。

答案 2 :(得分:0)

这样的事情可能看起来很优雅:

<?php
    $data = array(
    "one" => "1",
    "two" => "2"
    );
    $control  = array(
    "one" => "1",
    "two" => "2",
    "three" => "3"
    );
    if ($data==$control || ($someBool && $data==array_slice($control,0,count($control)-1))
    {
        return $c;
    }
?>

答案 3 :(得分:0)

至于你的功能,我这样做了:

function chopByKey(array $arr, $key){
  if(array_key_exists($key,$arr)){
    unset($arr[$key]);
    return $arr;
  }
  // depending on your desired result, either return $arr or return false here.
  return $arr;
}