• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • array_intersect_ukey()

    (PHP 5 >= 5.1.0, PHP 7)

    用回调函数比较键名来计算数组的交集

    说明

    array_intersect_ukey(array $array1,array $array2[,array $...],callable$key_compare_func): array

    array_intersect_ukey()返回一个数组,该数组包含了所有出现在$array1中并同时出现在所有其它参数数组中的键名的值。

    参数

    $array1

    Initial array for comparison of the arrays.

    $array2

    First array to compare keys against.

    Variable list of array arguments to compare keys against.

    $key_compare_func

    在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。

    callback(mixed $a,mixed $b): int

    返回值

    Returns the values of$array1whose keys exist in all the arguments.

    范例

    Example #1array_intersect_ukey()例子

    <?php
    function key_compare_func($key1, $key2)
    {
        if ($key1 == $key2)
            return 0;
        else if ($key1 > $key2)
            return 1;
        else
            return -1;
    }
    $array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
    $array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);
    var_dump(array_intersect_ukey($array1, $array2, 'key_compare_func'));
    ?>
    

    以上例程会输出:

    array(2) {
      ["blue"]=>
      int(1)
      ["green"]=>
      int(3)
    }
    

    上例中可以看到只有'blue''green'两个键名出现在两个数组中,因此被返回。此外注意'blue''green'的值在两个数组中是不同的。但因为只检查键名,因此还是匹配。返回的值只是$array1中的。

    参见

    "array_intersect_ukey" will not work if $key_compare_func is using regular expression to perform comparison. "_array_intersect_ukey" fully implements the "array_intersect_ukey" interface and handles properly boolean comparison. However, the native implementation should be preferred for efficiency reasons.
    <?php
    $key_compare_func = function ($a, $b) {
      var_dump('a=' . $a. '; b=' . $b);
      
      if (strpos($b, '/') === 0) {
        return preg_match($b, $a) > 0 ? 0 : -1;
      }
      
      if ($a == $b) {
        $weight = 0;
      } else if ($a > $b) {
        $weight = 1;
      } else {
        $weight = -1;
      }
      
      var_dump('literal comparison: ' . $weight);
      
      return $weight;
    };
    $foo = ['aab' => '', 'bbb' => '', 'ccb' => '', 'abb' => ''];
    $bar = ['/[a-z]b[a-z]/' => ''];
    $buz = ['/c[a-z][a-z]/' => ''];
    echo PHP_EOL . 'array_intersect_ukey' . PHP_EOL . PHP_EOL;
    $subject = array_intersect_ukey ($foo, $bar, $buz, $key_compare_func);
    echo PHP_EOL;
    var_dump($subject);
    echo PHP_EOL . '_array_intersect_ukey' . PHP_EOL . PHP_EOL;
    $subject = _array_intersect_ukey($foo, $bar, $buz, $key_compare_func);
    echo PHP_EOL;
    var_dump($subject);
    /**
     * @author Gajus Kuizinas <gk@anuary.com>
     * @version 1.0.0 (2013 09 30)
     * @url https://gist.github.com/gajus/271ad5f36337a32a184c
     */
    function _array_intersect_ukey (array $arr1, array $arr2, $key_compare_func) {
      $arr_matched = [];
      $arr_unmatched = [];
      
      $args = func_get_args();
      
      $key_compare_func = end($args);
      
      foreach ($arr1 as $k1 => $v1) {
        foreach ($arr2 as $k2 => $v2) {
          $diff = $key_compare_func($k1, $k2);
        
          //var_dump('k1=' . $k1 . ', k2=' . $k2 . ', diff=' . $diff);
          
          if ($diff === 0) {
            $arr_matched[$k1] = $v1;
          } else {
            $arr_unmatched[$k1] = $v1;
          }
        }
      }
      
      if (count($args) <= 3) {
        return $arr_matched;
      }
      
      array_splice($args, 0, 2, [$arr_unmatched]);
      
      return array_merge($arr_matched, call_user_func_array('_array_intersect_ukey', $args));
    }
    /*
    array_intersect_ukey
    string(12) "a=bbb; b=aab"
    string(21) "literal comparison: 1"
    string(12) "a=bbb; b=ccb"
    string(22) "literal comparison: -1"
    string(12) "a=abb; b=bbb"
    string(22) "literal comparison: -1"
    string(12) "a=aab; b=abb"
    string(22) "literal comparison: -1"
    string(22) "a=aab; b=/[a-z]b[a-z]/"
    string(22) "a=abb; b=/[a-z]b[a-z]/"
    string(22) "a=abb; b=/c[a-z][a-z]/"
    array(0) {
    }
    _array_intersect_ukey
    string(22) "a=aab; b=/[a-z]b[a-z]/"
    string(22) "a=bbb; b=/[a-z]b[a-z]/"
    string(22) "a=ccb; b=/[a-z]b[a-z]/"
    string(22) "a=abb; b=/[a-z]b[a-z]/"
    string(22) "a=aab; b=/c[a-z][a-z]/"
    string(22) "a=ccb; b=/c[a-z][a-z]/"
    array(3) {
     ["bbb"]=>
     string(0) ""
     ["abb"]=>
     string(0) ""
     ["ccb"]=>
     string(0) ""
    }*/
    ?>