【问题标题】:array_keys function with search value is an array returns empty as result in php (No Foreach)具有搜索值的 array_keys 函数是一个数组在 php 中返回空结果(无 Foreach)
【发布时间】:2023-04-03 08:40:01
【问题描述】:
$full_json ='{
"1stelement": {
"2ndelement": {
  "elements": [
    {
      "test1": 383,
      "test2": 100
    },
    {
      "test1": 48,
      "test2": 5
    },
    {
      "test1": 383,
      "test2": 100
    },
    {
      "test1": 48,
      "test2": 6
    },
    {
      "test1": 383,
      "test2": 100
    },
    {
      "test1": 48,
      "test2": 7
    },
    {
      "test1": 383,
      "test2": 100
    },
    {
      "test1": 48,
      "test2": 8
    },
    {
      "test1": 383,
      "test2": 100
    },
    {
      "test1": 48,
      "test2": 9
    },
    {
      "test1": 383,
      "test2": 100
    },
    {
      "test1": 48,
      "test2": 10
    }
  ]
}
}
}';

$full = json_decode($full_json,true);
$test2range = array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
$values=array_keys(array_column($full['1stelement']['2ndelement']['elements'], 'test2'),$test2range ,true);
// $values=array_keys(array_column($full['1stelement']['2ndelement']['elements'], 'test2'),5 ,true); // returns result
var_dump($values);
exit;

我想获得array_keys 返回值以进一步处理。

如果没有 array_keys 函数,我们可以使用 foreach 循环获取值,这是不可取的。

根据array_keys的定义,搜索值参数可以是mixed type,所以我们可以给出值的数组。

当我尝试这样做时,结果总是作为一个空数组给出,这不是预期的结果。

谁能解释一下如何做到这一点?

【问题讨论】:

  • array_keys() 仅支持像 print_r(array_keys($a,"10",true)); 这样的单个值
  • OP 似乎知道它支持单值(作为他的例子适用于单值),他的问题是为什么不多

标签: php arrays multidimensional-array


【解决方案1】:

正如您在array_keys source code 中看到的那样(在函数fast_is_identical_function 中)之前有类型比较 - 这就是不支持数组的原因 - 因为核心代码无法破坏数组。

mix_value 的意思是您可以将数组与数组或 int 与 int 进行比较... - 但不是搜索的多选项。

但是,您可以这样做:

$values = array_keys(array_filter($full['1stelement']['2ndelement']['elements'], function ($e) use ($test2range) {return in_array($e["test2"], $test2range);}));

或者你可以自己实现:

function array_keys_multi_search($arr, $searchValues, $strict) {
    $res = array();
    foreach($searchValues as $v)
        $res = array_merge($res, array_keys($arr, $v, $strict));
    return $res;
}

【讨论】:

    【解决方案2】:

    尝试array_intersect() 来检查匹配的键。

    $full = json_decode($full_json,true);
    
    $test2range = array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
    
    $values= array_column($full['1stelement']['2ndelement']['elements'], 'test2');
    
    $result=array_intersect($test2range,$values);
    
    var_dump($result);
    exit;
    

    【讨论】:

      【解决方案3】:

      解码你的 json 数组

      $full = (array) json_decode($this->input->post($full_json);
      

      然后使用 foreach 获取值

       foreach($full['1stelement']['2ndelement']['elements'] as $key => $values){
      
      }
      

      【讨论】:

      • OP 寻找键而不是值
      • 使用 $key 变量获取密钥
      猜你喜欢
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多