【问题标题】:php array searching with keysphp数组用键搜索
【发布时间】:2026-01-11 06:45:02
【问题描述】:

假设一个数组如下:

Array
(
    [a] => Array
        (
            [id] => 3
            [x] => binginb
        )

    [b] => Array
        (
            [id] => 5
            [x] => dibdab
        )

)

现在我想根据它的内容访问这个数组,所以在这种情况下是idx

如果能在这里做类似的事情就好了

 $i = array_search(5,array_column($a,'id'));
 $stuff = dostuff($a[$i]['x']);

但这不起作用,因为$a[1] 是一个未定义的偏移量。

是否可以在不改变原始数组的情况下做这样的事情?

【问题讨论】:

  • 这可能对id 有意义,但是当有多个结果时,您会期望返回什么?

标签: php arrays search


【解决方案1】:

array_search() 返回array_column() 结果的索引。您可以使用array_keys() 来查找该索引的键:

$a = [
   'a' => ['id' => 3, 'x' => 'binginb'],
   'b' => ['id' => 5, 'x' => 'dibdab'],
   ];
$i = array_search(5, array_column($a,'id'));
$key = array_keys($a)[$i]; // get the key at the $i index.
$stuff = dostuff($a[$key]['x']); // Here, $a[$key]['x'] = 'dibdab'

请注意,如果未找到该值,array_search() 可能会返回 FALSE。您可以在使用之前测试结果(使用严格比较)。

$i = array_search(5, array_column($a,'id'));
if ($i !== false) {
    $key = array_keys($a)[$i]; // get the key at the $i index.
    $stuff = dostuff($a[$key]['x']); // Here, $a[$key]['x'] = 'dibdab'
}

【讨论】:

  • 为了稍微扩展这项技术,如果你想获得所有匹配项 ('id' == 5),你可以使用 $k = array_keys... 而不是 array_search 然后 print_r($a[array_keys($a)[$k[1]]]['x']); 将是 "'x'对于 $a" 中匹配 "ID = 5" 的第二个元素
【解决方案2】:

使用array_columnid 重新索引数组:

$new = array_column($a, 'x', 'id');

然后搜索5,只需:

echo $new[5];

如果您可能不止x

$new = array_column($a, null, 'id');

然后:

echo $new[5]['x'];

如果你只这样做一次:

echo array_column($a, 'x', 'id')[5];

或者:

echo array_column($a, null, 'id')[5]['x'];

【讨论】:

    【解决方案3】:

    如果你不想被 PHP 内置函数限制,那么试试这个:

    <?php
    function dostuff( $var1 )
    {
        print_r($var1);
    }
    
    $a = [
       'a' => ['id' => 3, 'x' => 'binginb'],
       'b' => ['id' => 5, 'x' => 'dibdab'],
    ];
    
    array_map( // 2: pass each element from the result from array_filter to dostuff()
        'dostuff',
        array_filter( // 1: filter $a based on the criteria defined in the anonymous function
            $a,
            function($item){
                return $item['id'] === 5;
            }
        )
    );
    

    输出:

    Array
    (
        [id] => 5
        [x] => dibdab
    )
    

    【讨论】:

      【解决方案4】:

      我认为它会帮助你,

      <?php
      $array = array(
          'a' => array(
              'id' => 3,
              'x' => 'binginb',
          ),
          'b' => array(
              'id' => 5,
              'x' => 'dibdab',
          )
      );
      
      $i = array_column($array,'x','id');
      

      //$i的输出

      数组 ( [3] => binginb [5] => dibdab)

      $stuff = dostuff($i[5]); // $i[5] return dibdab
      

      【讨论】: