1

多次元配列の値が特定の割合で同じかどうかを確認したい。

たとえば、これは私の配列です:

$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」で確認すると、「orchid」と 55.56% が返されます。similar_text(): に少し似ています: 動作します

指定された値 (針) が多次元配列の値と同じかどうかを確認できる関数を取得しました。

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" が多次元配列の ["title"] と 60% を超える場合、その値をパーセントで指定します。

4

1 に答える 1

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
        )

)

類似度がしきい値を下回ったため、daisy が返されていないことに注意してください。参考までに、類似度は 13.3333333r です。

于 2012-12-07T12:42:30.103 に答える