2017-09-16 37 views
0

我有這樣的一個數組:與多個字陣搜索

(
(0) => Array 
    (
     (uid) => '100', 
     (name) => 'Blue t-shirt 4 years', 
     (ean) => '123456' 
    ), 

(1) => Array 
    (
     (uid) => '5465', 
     (name) => 'blue shirt 24 years', 
     (ean) => '123' 
    ), 

(2) => Array 
    (
     (uid) => '40489', 
     (name) => 'Shirt 4 Years', 
     (ean) => '12345' 
    ) 
); 

我想統計數組在很多項的時間都在關鍵的名稱改爲「襯衫4年」不區分大小寫或有相同的'恩'數字。

在這種情況下將返回2.什麼是做到這一點的最好方法是什麼?

+1

分享您的嘗試和預期產出? – C2486

+0

數據庫中的數據是? – user2182349

+0

@ user2486我是在數據庫中查詢的。我正在獲取數組中的數據,並且在我做另一個查詢來計算它之後。但是它太慢了。 – Roots

回答

0

您可以準備匹配任何順序提供的話正則表達式:

function words_regex(array $words) { 
    $regex = array_reduce($words, function($carry, $word) { 
     return $carry . '(?=.*\b' . preg_quote($word) . '\b)'; 
    }, '/'); 

    return $regex . '.*/i'; 
} 

有了這個功能,您可以篩選項目並計數:

$regex = words_regex($words); 

$count = count(array_filter($array, function($item) use ($regex) { 
    return preg_match($regex, $item['name']); 
})); 

這是working demo

+0

我如何檢查名稱是否與名稱不符,請檢查EAN是否匹配? – Roots

0

這是兩個不同的目標。第一個(計數鍵名)是一個簡單的foreach循環

  1. 通過數組,如果測試初始化​​您的計數器爲0
  2. 循環,增加櫃檯

第二個邏輯需要你有計數器的每個ean一個數組,循環通過陣列和計數每個ean成陣列插槽。然後你可以遍歷數組,並找到那些具有計數> 1

通過相同的循環將工作結合使用這兩種,但你需要分析的第二個條件。

0

您通過陣列需要循環,並通過一個檢查之一,如果有匹配的字符串,並將其數到一個變量..

<?php 
    $array = [ 
     ["uid"=>'100', 'name'=>'Blue t-shirt 4 years', 'ean'=>'123456'], 
     ["uid"=>'5465', 'name'=>'blue shirt 24 years', 'ean'=>'123'], 
     ["uid"=>'40489', 'name'=>'Shirt 4 Years', 'ean'=>'12345'] 
    ]; 
    echo("It's ".countArrayVal($array, 'name', 'shirt 4 years')); 

    function countArrayVal($array, $key, $search){ 
     $count = 0; 
     for ($i=0; $i < count($array); $i++) { //Loop 
      if(stripos($array[$i][$key], $search)!==false) //Check matched string 
       $count++; //Update the counter 
     } 
     return $count; //Return count 
    }