具有多个单词的数组搜索

时间:2017-09-16 01:49:52

标签: php arrays

我有一个这样的数组:

(
(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年"不区分大小写或具有相同的“ean”#39;号。

在这种情况下会返回2.最好的方法是什么?

3 个答案:

答案 0 :(得分:0)

这是两个不同的目标。第一个(计数键名称)是一个简单的foreach循环

  1. 将您的计数器初始化为0
  2. 循环遍历数组,如果测试,则增加计数器
  3. 第二个逻辑要求你为每个ean提供一个计数器数组,循环遍历数组并将每个ean计入一个数组槽。然后你可以遍历数组并找到那些有计数> 1

    通过相同的循环组合两个将起作用,但是你需要分析第二个条件。

答案 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
    }

答案 2 :(得分:0)

You can prepare regex that matches provided words in any order:

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

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

Having this function you can filter items and count them:

$regex = words_regex($words);

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

Here is working demo的链接文字。