【问题标题】:Filter array so all elements with key is specified are removed过滤数组,以便删除所有指定键的元素
【发布时间】:2012-03-26 21:11:02
【问题描述】:

我正在寻找一种过滤数组的方法,以便删除所有指定键的元素。

这是我的意思的一个例子:

$x = array(
    'a', // pass
    'b::a', // pass
    array('a'), // pass
    array('a', 'b'), // pass
    function() { // pass

        return 'a';

    },
    'a' => 'b', // doesn't pass because key is specified
);

remove_elements_with_key_specified($x)之后...

array(5) {
    [0]=> string(1) "a"
    [1]=> string(4) "b::a"
    [2]=> array(1) { [0]=> string(1) "a" }
    [3]=> array(2) { [0]=> string(1) "a" [1]=> string(1) "b" }
    [4]=> object(Closure)#1 (0) { }
}

怎么做?简单地检查 key 是否是一个字符串是最好的方法吗?

【问题讨论】:

    标签: php arrays filter associative-array


    【解决方案1】:

    is_int() 可以工作:

    foreach($x as $k=>$v){
        if(!is_int($k)){
            unset($x[$k]);
        }
    }
    

    来自文档:

    <?php
    if (is_int(23)) {
        echo "is integer\n";
    } else {
        echo "is not an integer\n";
    }
    var_dump(is_int(23));
    var_dump(is_int("23"));
    var_dump(is_int(23.5));
    var_dump(is_int(true));
    ?>
    

    上面的例子会输出:

    is integer
    bool(true)
    bool(false)
    bool(false)
    bool(false)
    

    【讨论】:

      【解决方案2】:

      你所有的元素都有一个隐含的数字键,所以我猜你想在这里做的是这样的:

      foreach($x as $key => $value) {
          if(!is_numeric($key) {
               unset($x[$key]);
          }
      }
      

      应该可以的。

      【讨论】:

      • is_numeric 对数字字符串和浮点数返回 true,而数组键不应该这样。
      • 是的,但是在这种情况下,这可以解决问题。但是,is_int 会更好。
      猜你喜欢
      • 1970-01-01
      • 2013-09-09
      • 2016-09-19
      • 2011-12-26
      • 2016-08-03
      • 1970-01-01
      • 2012-06-18
      • 2016-02-12
      • 1970-01-01
      相关资源
      最近更新 更多