Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数组筛选器使用键筛选数据_Php_Arrays_Array Filter - Fatal编程技术网

Php 数组筛选器使用键筛选数据

Php 数组筛选器使用键筛选数据,php,arrays,array-filter,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

我有如下数组

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',
        )
我需要找出具有如下父值的数组

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',
        )

如何在此处使用数组过滤器?

如果名称发生更改,您最好检查键中是否存在
,而不是众多项的实际值

不幸的是,PHP不提供对
array\u filter
函数中的数组键的访问。因此,您最好使用
foreach()
并使用以下方法检查时段:

然后可以调用该函数并将其结果分配给数组。大概是这样的:

$parentArray = parentsOnly($array);

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

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

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

$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 )

如果保证数组中的值是唯一的,则可以执行数组翻转以交换键和值,然后执行数组过滤,然后再次执行数组翻转

$_a = array_flip($a);
$_a = array_filter($_a,function($val){
                         if(false === strpos($val,".")){
                           return true;
                         }
                         return false;
                   });
$a = array_flip($_a);
如果没有,您可以使用array\u walk来清空子值,然后使用array\u filter。如果null是父母的一个可能值(或任何解析为false的值),那么您可以始终选择自己的值用于孩子,并根据该值进行筛选。如果没有这样的值可以使用,则此解决方案将不起作用

$_a = $a;
array_walk($_a,function(&$val,$key){
                         if(false !== strpos($val,".")){
                           $val = null;
                         }
           });
$a = array_filter($_a);
您还可以使用数组\ U键、数组\过滤器和数组\ U相交\键。无论值是否唯一,这都将起作用,并且与第二种解决方案不同,如果父值为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,所以我介绍了使用它的各种选项。但是,正如其他人所说,如果您需要基于键的值进行过滤,那么仅使用array_filter是无法做到这一点的。到目前为止,您拥有什么?您不能使用PHP的
array_filter()
函数,因为它只对值进行过滤,所以您尝试过一个简单的
foreach()
循环吗?请注意,在我的版本中,我检查false==strpos,而不仅仅是!strpos(或false==strpos)。。。。使用此表单很好,因为如果指针作为草堆中的第一个字符出现,它将返回0。我认为在你的情况下,“.”不可能成为第一个角色,但是,像我这样做并没有什么坏处,一旦你养成了这样做的习惯,你就不必担心在重要的时候去做。虽然在你的情况下它可能会起作用,但上面的解决方案可能会在其他地方引起问题
strpos($haystack,$pineel)
返回$haystack中$pineel的第一个位置,如果未找到,则返回false。因此,在这个场景中,
$foo=“barbaz”;如果(!strpos($foo,bar)){echo“未找到”}否则{echo“已找到”}
您的输出将“未找到”,因为strpos将返回0。您应该始终严格检查strpos
$foo=“barbaz”;如果(false==strpos($foo,“bar”){echo“找不到”}否则{echo“找到”}
将输出“找到”