【问题标题】:Simple way to get only non-numeric keys from an array从数组中仅获取非数字键的简单方法
【发布时间】:2014-10-26 04:41:51
【问题描述】:

所以我有一个这样的 PHP 数组:

Array
(
    [0] => Array
        (
            [offset] => 1
            [0] => 1
            [name] => Value:990937970
            [1] => Value:990937970
        )

    [1] => Array
        (
            [offset] => 2
            [0] => 2
            [name] => Value:482758260
            [1] => Value:482758260
        )

    [2] => Array
        (
            [offset] => 3
            [0] => 3
            [name] => Value:2045053536
            [1] => Value:2045053536
        )

)

但我想改一下,不返回数字键,像这样:

Array
(
    [0] => Array
        (
            [offset] => 1
            [name] => Value:990937970
        )

    [1] => Array
        (
            [offset] => 2
            [name] => Value:482758260
        )

    [2] => Array
        (
            [offset] => 3
            [name] => Value:2045053536
        )

)

我的问题:有没有一种简单的方法(没有foreachwhile 循环)去除这些数字键?

我知道我可以做一个foreach 来检查 $key 是否是一个字符串;但是,循环会添加到我的代码的 cyclomatic complexity 中,所以我试图避免它们。

【问题讨论】:

  • 这些数组是凭空出现的,还是来自数据库查询? (这可能更容易更改为仅返回关联数组)
  • 它们来自数据库查询,但是最好知道如何在不知道确切键的数组上执行此操作。 (也有一些 API 可以返回这些类型的数组。)
  • 查看 array_intersect/filter 答案一式两份;虽然可能需要对嵌套列表进行第二次回调,但仍然比仅使用 *FETCH_ASSOC 慢。
  • @mario 我无法让任何这些方法适用于该数组(仅影响顶级数组)

标签: php arrays


【解决方案1】:

好吧,如果你真的不想使用foreach,你可以这样做:

array_walk($data, function (&$v) {
    $keys = array_filter(array_keys($v), function($k) {return !is_int($k);});
    $v = array_intersect_key($v, array_flip($keys));
});

array_walk() 仍然像foreach 那样循环;它只是没有明确显示。

另外,正如 mario 所说,修改数据库查询将是比这更值得推荐的做法。如果您必须在 PHP 端执行此操作,则 foreach 会更有效。

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-09
    • 2021-05-31
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多