【问题标题】:Filtering a php array using binary使用二进制过滤php数组
【发布时间】:2014-12-29 13:08:10
【问题描述】:

有一个php数组

$arr = array(
     1  => "a", 
     2  => "b", 
     4  => "c", 
     8  => "d",
     16 => "e", 
     32 => "f"
);

和一个二进制数

$filter=101101

我想过滤数组并只保留二进制中相应值为 1 的键 对于这个例子,我会:

$arr = array(
     1  => "a", 
     4  => "c", 
     8  => "d",
     32 => "f"
);

或者对于

$filter=110001

得到

$arr = array(
     1  => "a", 
     2  => "b", 
     32 => "f"
);

【问题讨论】:

  • 为什么要使用二进制形式而不是在数组键中使用正常计数来引用它们?
  • 其实$filter存储为十进制。所以 101101 存储为 45 而 110001 存储为 35。这是一种排序方式。正常计数是什么意思?

标签: php arrays binary filtering


【解决方案1】:

假设$filter的长度总是和数组元素个数一样:

$filter_arr = str_split($filter);
$new_arr = array();
$i = 0;
foreach ($arr as $key => $val) {
    if ($filter_arr[$i] == 1) {
        $new_arr[$key] = $val;
    }
    $i++;
} 

使用您给定的数组,过滤器等于 101101,$new_arr 将等于:

Array
(
    [1] => a
    [4] => c
    [8] => d
    [32] => f
)

See demo

【讨论】:

  • 是的,数组元素的个数总是和$filter的长度一样。
【解决方案2】:

这应该适合你:

<?php

    $arr = array(
         1  => "a", 
         2  => "b", 
         4  => "c", 
         8  => "d",
         16 => "e", 
         32 => "f"
    );

    $filter=110001;
    $filerValue = str_split($filter);
    $count = 0;

    foreach($arr as $k => $v) {
        if($filerValue[$count] == 0)
            unset($arr[$k]);
        $count++;
    }

    var_dump($arr);

?>

输出:

    array(3) {
      [1]=>
      string(1) "a"
      [2]=>
      string(1) "b"
      [32]=>
      string(1) "f"
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2012-05-10
    • 2011-11-12
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多