簡體   English   中英

PHP過濾器多維關聯數組的鍵和值

[英]Php filter multidimensional associative array by key and values

我正在嘗試編寫一個函數來過濾多維關聯數組,其中查詢數組必須與所有鍵和所有值都匹配。

例如,我需要對此進行過濾:

$data = array(
       array("id"=>"1","color"=>"Red","size" => "L"),
       array("id"=>"2","color"=>"Blue","size"  => "L"),
       array("id"=>"3","color"=>"Blue","size"  => "L")
    );

數組中提供了我需要匹配的參數:

array("color"=>"Red","size" => "L")

所以我應該從第一個數組中獲取:

array("id"=>"1","color"=>"Red","size" => "L")

這是唯一與所有鍵名和值完全匹配的鍵。

我有想法迭代數組並比較每個值,如:

$value['color'] == $query['color'] && $value['size'] == $query['size'] . . .

但我認為這不是最好的,我想編寫一個不帶硬編碼數組鍵的通用函數。 我能怎么做?

$data = array(
   array("id"=>"1","color"=>"Red","size" => "L"),
   array("id"=>"2","color"=>"Blue","size"  => "L"),
   array("id"=>"3","color"=>"Blue","size"  => "L")
);
$match = array("color"=>"Red","size" => "L");
$data = array_filter($data, function($input) use ($match) {
  return $input["color"] === $match["color"] && $input["size"] === $match["size"];
});

這樣的事情應該起作用

為什么不使用數學家集合論和交集? 用Php數組術語,這意味着您可以使用array_intersect從兩個數組中獲取相等的值。

public function filter(array $query, array $data) : array
{
    $result = array_filter($data, function ($item) use ($query) 
    {
        $valueInters = array_intersect($item,$query);
        $keyIntersec = array_intersect(array_flip($valueInters),array_flip($query));
        return ( count($valueInters) == count($query) && (count($keyIntersec)) == count($query));        
    });
    return $result;
}

簡要說明:該函數迭代需要過濾的數組的數組。 每個子數組都與查詢數組相交,結果是只有兩個數組的值相似的數組。 然后,如果最后一個的長度與查詢的長度相同,則意味着您完全匹配了查詢參數中的所有值。

由於要確保匹配的值對應於同一鍵,因此將查詢數組和要過濾的數組都翻轉,然后執行與以前相同的操作。

沒有任何東西是硬編碼的,它是一種通用代碼,您可以僅使用不合格的數據進行過濾和查詢。

這幾乎與其他答案的方向相同,但是我認為使用array_diff_assoc可以顯着簡化回調。 基本上只是將$data中的每一行與目標數組進行比較。 如果目標數組中的所有鍵值對都包括在該行中,則差異將為空。

$target = ["color"=>"Red","size" => "L"];

$filtered = array_filter($data, function($row) use ($target) {
    return !array_diff_assoc($target, $row);
});

暫無
暫無

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

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