【问题标题】:How to slice an array by key, not offset?如何按键切片数组,而不是偏移量?
【发布时间】:2013-05-17 23:41:37
【问题描述】:

PHP 函数 array_slice() 按偏移量返回元素序列,如下所示:

// sample data
$a = array('a','b','c',100=>'aa',101=>'bb',102=>'cc'); 

// outputs empty array because offset 100 not defined
print_r(array_slice($a,100));

当前函数参数:

array_slice ( $array, $offset, $length, $preserve_keys) 

我需要这样的东西:

array_slice ( $array, **$key**, $length, $preserve_keys) 

根据上面的print_r输出这个:

array (
   100 => aa,
   101 => bb,
   102 => cc
)

【问题讨论】:

    标签: php arrays slice offset array-filter


    【解决方案1】:

    要查找键的偏移量,请使用array_search() 搜索键,可以使用array_keys() 检索。当数组 ($a) 中不存在指定的键 (100) 时,array_search() 将返回 FALSE

    $key = array_search(100, array_keys($a), true);
    if ($key !== false) {
        $slice = array_slice($a, $key, null, true);
        var_export($slice);
    }
    

    打印:

    array (
      100 => 'aa',
      101 => 'bb',
      102 => 'cc',
    )
    

    【讨论】:

      【解决方案2】:

      替代解决方案

      如果您想使用您想要获取的项目的键对数组进行切片,您可以使用以下自定义函数来执行此操作:

      function array_slice_keys($array, $keys = null) {
          if ( empty($keys) ) {
              $keys = array_keys($array);
          }
          if ( !is_array($keys) ) {
              $keys = array($keys);
          }
          if ( !is_array($array) ) {
              return array();
          } else {
              return array_intersect_key($array, array_fill_keys($keys, '1'));
          }
      }
      

      用法:

      $ar = [
          'key1' => 'a',
          'key2' => 'b',
          'key3' => 'c',
          'key4' => 'd',
          'key5' => 'e',
          'key6' => 'f',
      ];
      
      // Get the values from the array with these keys:
      $items = array_slice_keys( $ar, array('key2', 'key3', 'key5') );
      

      结果:

      Array
      (
          [key2] => b
          [key3] => c
          [key5] => e
      )
      

      【讨论】:

      • 为什么$keys 是可选参数?这个函数处理了这么多没有键的防御性情况,得到一个没有键的数组,得到一个空数组,这似乎很奇怪?
      • +1 我更喜欢这个而不是array_search 答案,因为这样添加更多键更容易。但是你可以在没有(不必要的)功能的情况下回答array_intersect_key($array, array_fill_keys($keys, '1'))
      【解决方案3】:

      返回$array的部分,其键存在于数组$keys中:

      array_intersect_key($array,array_flip($keys));
      

      【讨论】:

      • 不确定您的答案是否回答了 OP 的问题,但这正是我一直在搜索的内容:)
      猜你喜欢
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2020-04-13
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      相关资源
      最近更新 更多