数组过滤器使用键过滤数据

时间:2014-01-17 15:12:43

标签: php arrays array-filter

我的数组如下

array('1'=>'parent 1',
      '1.1'=>'1st child of 1',
      '1.2'=>'2nd child of 1',
      '2'=>'parent 2',
      '2.1'=>'1st child of 2',
      '2.2'=>'2nd child of 2',
      '3'=>'parent 3',
      '3.1'=>'1st child of 3',
      '3.2'=>'2nd child of 4'
    )

我需要查找具有父值的数组,如下所示

 array('1'=>'parent 1',
       '2'=>'parent 2',
      '3'=>'parent 3',
        )

我怎么能在这里使用数组过滤器?

4 个答案:

答案 0 :(得分:1)

如果更改名称,您可能最好检查密钥中是否存在.,而不是检查众多条目的实际值。

不幸的是,PHP无法访问array_filter函数内的数组键。因此,您最好使用foreach()并使用strpos()检查期间:

function parentsOnly($arr)
{
    $retArr = array();

    foreach($arr as $key => $val)
    {
        if(strpos('.', $key) === false)
        {
             $retArr[$key] = $value;
        }
    }

    return $retArr;
}

然后,您可以调用该函数并将其结果分配给该数组。像这样:

$parentArray = parentsOnly($array);

答案 1 :(得分:0)

如果数组值没有重复,并且它们都是字符串:

$result = array_flip(
    array_filter(
        array_flip($myArray),
        function ($value) {
            return strpos('.', $value === false);
        }
    )
);

答案 2 :(得分:0)

它可能只是一个简单的调整

$arr=array('1'=>'parent 1',
      '1.1'=>'1st child of 1',
      '1.2'=>'2nd child of 1',
      '2'=>'parent 2',
      '2.1'=>'1st child of 2',
      '2.2'=>'2nd child of 2',
      '3'=>'parent 3',
      '3.1'=>'1st child of 3',
      '3.2'=>'2nd child of 4'
    );
$f = array_filter(array_keys($arr), function ($k){ return !strpos($k,"."); });
$filter = array_intersect_key($arr, array_flip($f));
print_r($filter);

输出

Array ( [1] => parent 1 [2] => parent 2 [3] => parent 3 )

答案 3 :(得分:0)

如果在阵列中保证唯一值,可以使用array_flip来交换键和值,然后再使用array_filter,再使用array_flip

$_a = array_flip($a);
$_a = array_filter($_a,function($val){
                         if(false === strpos($val,".")){
                           return true;
                         }
                         return false;
                   });
$a = array_flip($_a);

如果没有,您可以使用array_walk将子值清空,然后使用array_filter。如果null是父项的可能值(或任何解析为false的值),那么您始终可以选择自己的子项用于子项,并按此过滤。如果没有可以使用的值,则此解决方案将无效。

$_a = $a;
array_walk($_a,function(&$val,$key){
                         if(false !== strpos($val,".")){
                           $val = null;
                         }
           });
$a = array_filter($_a);

您还可以使用array_keys,array_filter和array_intersect_keys。无论值是否唯一,这都将起作用,并且,与第二个解决方案不同,如果父值为null,它将起作用。

$_a = array_keys($a);
$_a = array_filter($_a,function($val){
                         if(false === strpos($val,".")){
                           return true;
                         }
                         return false;
                   });
$_a = array_flip($_a); //1=>foo, 2=>bar becomes foo=>1, bar=>2
$a = array_intersect_keys($a,$_a);

我知道在可能的情况下使用数组函数通常更可取,但我不确定上述任何解决方案是否会比简单的foreach更好:

$_a = [];
foreach($a as $k=>$v){
  if(false === strpos($k,".")){
    $_a[$k] = $v;
  }
}

但是,您的原始问题询问了如何使用array_filter,因此我提出了各种使用它的选项。正如其他人所说的那样,如果你需要根据键的值进行过滤,那么使用JUST array_filter无法做到这一点