3

私はこの配列を持っています:

$array = array('abc123', 'ac123', 'tbc123', '1ac123');

各文字列を互いに比較して、最長の共通部分文字列を見つけたいと思います。上記の例では、結果は になりますc123

4

5 に答える 5

9

アップデート

私は質問を完全に誤解しています。目的は、文字列の配列間の最大の重複を見つけることでした:

$array = array('abc123', 'ac123', 'tbc123', '1ac123');

function overlap($a, $b)
{
        if (!strlen($b)) {
                return '';
        }

        if (strpos($a, $b) !== false) {
                return $b;
        }

        $left = overlap($a, substr($b, 1));
        $right = overlap($a, substr($b, 0, -1));

        return strlen($left) > strlen($right) ? $left : $right;
}

$biggest = null;
foreach ($array as $item) {
        if ($biggest === null) {
                $biggest = $item;
        }
        if (($biggest = overlap($biggest, $item)) === '') {
                break;
        }
}

echo "Biggest match = $biggest\n";

私は再帰が得意ではありませんが、これでうまくいくはずです;-)

古い答え

私はおそらくそのために使用preg_grep()します。検索文字列に基づいて見つかった一致の配列を返します。

$matches = preg_grep('/' . preg_quote($find, '/') . '/', $array);

または、次を使用できますarray_filter()

$matches = array_filter($array, function($item) use ($find) {
    return strpos($item, $find) !== false;
});

配列内のすべての文字列に最大の一致があるように、値「c123」を抽出する必要があります

ここでやりたいことは、上記の出力を文字列の長さに基づいて並べ替え (つまり、最初に文字列の長さが最小になるように)、最初の項目を取得することだと思います。

if ($matches) {
    usort($matches,  function($a, $b) {
        return strlen($a) - strlen($b);
    });
    echo current($matches); // take first one: ac123
}

私がそれについて間違っているかどうか教えてください。


$find要素に正確に一致するかどうかを確認した直後の場合:

$matching_keys = array_keys($array, $find, true); // could be empty array

または:

$matching_key = array_search($find, $array, true); // could be false

またはイベント:

$have_value = in_array($find, $array, true);
于 2013-03-15T09:53:32.927 に答える
0

ここで使用されているin_array http://codepad.org/nOdaajNe を使用するか、ここで使用されている array_search を使用できますhttp://codepad.org/DAC1bVCi

それがあなたを助けることができるかどうか見てください..

ドキュメント リンク : http://php.net/manual/en/function.array-search.phpおよびhttp://www.php.net/manual/en/function.in-array.php

于 2013-03-15T10:17:55.873 に答える
0
in_array($find, $array);

配列内にある場合は true を返しますが、完全に一致する必要があります。この場合、「ac123」は見つかりません。

文字列が含まれているかどうかを確認したい場合は、配列をループして preg_match() などを使用する必要があります

于 2013-03-15T09:52:43.150 に答える
0

コールバックで array_filter を使用できます。

$output = array_filter ($input, function ($elem) { return false !== strpos ($elem, 'c123'); });
于 2013-03-15T09:58:33.560 に答える
0
<?php
$array1 = array('abc123', 'ac123', 'tbc123', '1ac123');

if (in_array("c123", $array1)) {
    echo "Got c123";
}

?>
于 2013-03-15T10:00:10.370 に答える