按给定值返回多维数组中的相应值和相同的百分比。 (PHP)

时间:2012-12-07 12:15:55

标签: php arrays multidimensional-array

我想检查多维数组中的值是否与给定的百分比相同。

例如,这是我的数组:

$shop = array( array( Title => "rose", 
                      Price => 1.25,
                      Number => 15 
                    ),
               array( Title => "daisy", 
                      Price => 0.75,
                      Number => 25,
                    ),
               array( Title => "orchid", 
                      Price => 1.15,
                      Number => 7 
                    )
             );

并且如果给定值(比如“testorchid”)与多维数组中的值相同55%。返回多维数组中相应的值和相同的过程。

所以在这种情况下。如果我检查“testorchid”,它返回“兰花”和55.56诉讼。 有点像similar_text():工作

我有一个函数可以检查给定值(needle)是否与多维数组中的值相同:

function in_array_r($needle, $haystack, $strict = true) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
    }

但它只在值完全相同时才返回true。不是多维数组中的对应值,而不是相同值的百分比。

我想说这样的话:如果“orchidtest”是> 60%与多维数组中的[“title”]相同,然后将该值赋予百分比。

1 个答案:

答案 0 :(得分:1)

<?php
    $shop = array(
        array(
            'Title' => "rose",
            'Price' => 1.25,
            'Number' => 15
        ),
        array(
            'Title' => "daisy",
            'Price' => 0.75,
            'Number' => 25,
        ),
        array(
            'Title' => "orchid",
            'Price' => 1.15,
            'Number' => 7
        )
    );

    function find_similar($compare, $array, $threshold = 0)
    {
        $return = array();
        $score;
        foreach ($array as $k => $v)
        {
            similar_text($compare, $v['Title'], $score);
            if ($score >= $threshold)
            {
                $return[] = array(
                    'compared' => $compare,
                    'title' => $v['Title'],
                    'score' => number_format($score, 2)
                );
            }
        }
        usort($return, function ($a, $b)
        {
            if((double)$a['score'] == (double)$b['score'])
            {
                return 0;
            }
            return ($a['score'] < $b['score']) ? 1 : -1;
        });
        return $return;
    }

    $similar = find_similar('testorchid', $shop, 14);
?>

为您提供一个排序最相似的数组$similar,您可以指定一个阈值来切断无用的值。

print_r($similar)的输出:

Array
(
    [0] => Array
        (
            [compared] => testorchid
            [title] => orchid
            [score] => 75.00
        )

    [1] => Array
        (
            [compared] => testorchid
            [title] => rose
            [score] => 14.29
        )

)

请注意,雏菊尚未返回,因为它的相似性低于阈值。作为参考,它的相似性是13.3333333r