簡體   English   中英

數組過濾器,使用鍵過濾數據

[英]array filter to filter datas using key

我有下面的數組

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_filter函數內部的數組鍵的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);

如果數組值中沒有重復項,並且它們都是字符串:

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

如果保證在數組中具有唯一值,則可以執行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進行此操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM