【问题标题】:Is there a native function of what I am trying to achieve?是否有我想要实现的本机功能?
【发布时间】:2012-12-26 08:03:27
【问题描述】:

我写了一个似乎是常见任务的函数,我一直在查看php文档并找不到这个函数

/**
 * Move certain key/values from an array to a new one
 * @param array $array the original array
 * @param array $keys
 * @return $array
 */
function array_rip(array &$array, array $keys){
    $new = array();
    foreach($keys as $key){
        if(isset($array[$key])){
            $new[$key] = $array[$key];
            unset($array[$key]);
        }
    }
    return $new;
}

是否已经有这样的功能而我只是错过了显而易见的功能?

这是行为

<?php
$a = array('color'=>'green', 'fruit'=>'apple','item_id'=>33,'owner_id'=>420);
$b = array_rip($a,array('owner_id','item_id'));

print_r($a);
print_r($b);
?>

上面的例子会输出:

Array
(
    [color] => green
    [fruit] => apple
)

Array
(
    [owner_id]  => 420
    [item_id]  => 33
)

【问题讨论】:

标签: php arrays function


【解决方案1】:

你可以把它缩短到这个;不过我不认为它会更有效率。

function array_rip(array &$array, array $keys)
{
  $new = array_intersect_key($array, array_flip($keys));
  $array = array_diff($array, $new);
  return $new;
}

【讨论】:

    【解决方案2】:

    没有这样的功能,但你正在尝试的可以通过以下代码实现

    $arr1 = array('one' => 'one_v', 'two' => 'two_v', 'three' => 'three_v');
    $arr2 = array('one', 'three');
    
    // flip, so keys become values
    $arr1_flipped = array_flip($arr1);
    
    array_flip(array_diff($arr1_flipped, $arr2)); // returns Array([two] => two_v)
    
    array_flip(array_intersect($arr1_flipped, $arr2)) // returns Array ([one] => one_v  [three] => three_v)
    

    【讨论】:

      【解决方案3】:

      尝试使用array_combine()

      $array = array_combine(array_keys($array1), array_values($array2));   
      

      【讨论】:

      • array_combine() 要求两个数组具有相同数量的项目,否则您会收到错误消息“两个参数应具有相同数量的元素”。此外,OP 只想保留与第二个数组中包含的值匹配的键。
      【解决方案4】:

      如果你像@Artem L 建议的那样使用数组翻转功能,你可以实现你想要的,但它需要一点额外的处理时间,因为它调用 array_flip 3 次来实现你想要的。

      array_combine 无法满足您的需求。

      array_rip 在 php 中不可用。所以我建议你有算法,即为你的功能准备好逻辑。在您的项目中创建 functions.php 并将您的函数添加到此文件中。在你的代码中包含这个文件,然后你就可以使用这个函数了。

      【讨论】:

        【解决方案5】:

        如果您使用的是 PHP 5.1.0 或更高版本,则可以使用array_intersect_key(),如以下代码所示。

        function array_rip(array &$array, array $keys) {
          $result = array_intersect_key($array, array_flip($keys));
          $array = array_diff($array, $result);
        
          return $result;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多