1

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

$arr1 = array('Test', 'Hello', 'World', 'Foo', 'Bar1', 'Bar'); and
$arr2 = array('hello', 'Else', 'World', 'Tes', 'foo', 'BaR1', 'Bar'); 

2 つの配列を比較し、一致する要素の位置を 3 番目の配列に保存する必要があります$arr3 = (3, 0, 2, 4, 5, 6); //expected result, displaying position of matching element of $arr1 in $arr2.

「一致する」とは、同一 (例: World)、または部分的に同じ (例: Test & Tes) であるすべての要素と、類似しているが大文字と小文字が異なる要素 (例: Foo & foo、Bar & bar) を意味します。 )。

などの機能を使用して、一連の組み合わせとさまざまな機能を試しましたが、成功しませんでしarray_intersect(), substr_compare(), array_filter()た。私は正確な解決策を求めているのではなく、午後中ずっとぐるぐる回っているので、正しい軌道に乗せるための何かを求めているだけです.

4

4 に答える 4

1

これは私にとってはうまくいくように見えましたが、テストする必要があるいくつかのエッジケースが欠けていると確信しています:

foreach( $arr1 as $i => $val1) {
    $result = null;
    // Search the second array for an exact match, if found
    if( ($found = array_search( $val1, $arr2, true)) !== false) {
            $result = $found; 
    } else {
        // Otherwise, see if we can find a case-insensitive matching string where  the element from $arr2 is at the 0th location in the one from $arr1
        foreach( $arr2 as $j => $val2) {            
            if( stripos( $val1, $val2) === 0) {
                $result = $j;
                break;
            }
        }
    }
    $arr3[$i] = $result;
}

目的の出力配列が生成されます。

Array ( [0] => 3 [1] => 0 [2] => 2 [3] => 4 [4] => 5 [5] => 6 )  
于 2013-04-22T18:15:12.217 に答える
0

重複を説明するためにこれを思いつきました。両方のキーと両方の値を返すので、正しく機能しているかどうかを比較できます。それを改良するには、必要のない値を設定する行をコメントアウトするだけです。すべての場合に一致します。

<?php

$arr1 = array('Test', 'Hello', 'World', 'Foo', 'Bar1', 'Bar');
$arr2 = array('hello', 'Else', 'World', 'Tes', 'foo', 'BaR1', 'Bar');

$matches = array();
//setup the var for the initial match
$x=0;
foreach($arr1 as $key=>$value){

$searchPhrase = '!'.$value.'!i';

    //Setup the var for submatching (in case there is more than one)
    $y=0;
    foreach($arr2 as $key2=>$value2){
        if(preg_match($searchPhrase,$value2)){
            $matches[$x][$y]['key1']=$key;
            $matches[$x][$y]['key2']=$key2;
            $matches[$x][$y]['arr1']=$value;
            $matches[$x][$y]['arr2']=$value2;   
        }
        $y++;
    }
    unset($y);
    $x++;
}

print_r($matches);


?>

出力は次のようになります。

        Array
(
    [1] => Array
        (
            [0] => Array
                (
                    [key1] => 1
                    [key2] => 0
                    [arr1] => Hello
                    [arr2] => hello
                )

        )

    [2] => Array
        (
            [2] => Array
                (
                    [key1] => 2
                    [key2] => 2
                    [arr1] => World
                    [arr2] => World
                )

        )

    [3] => Array
        (
            [4] => Array
                (
                    [key1] => 3
                    [key2] => 4
                    [arr1] => Foo
                    [arr2] => foo
                )

        )

    [4] => Array
        (
            [5] => Array
                (
                    [key1] => 4
                    [key2] => 5
                    [arr1] => Bar1
                    [arr2] => BaR1
                )

        )

    [5] => Array
        (
            [5] => Array
                (
                    [key1] => 5
                    [key2] => 5
                    [arr1] => Bar
                    [arr2] => BaR1
                )

            [6] => Array
                (
                    [key1] => 5
                    [key2] => 6
                    [arr1] => Bar
                    [arr2] => Bar
                )

        )

)
于 2013-04-22T18:29:32.460 に答える
0

比較には、2 つの foreach ループと、stripos (または Unicode の場合は mb_stripos) が必要なようです。

于 2013-04-22T18:11:19.550 に答える
0

array_uintersect()「マッチング」アルゴリズムを実装するコールバック関数を試してください。

于 2013-04-22T18:06:37.000 に答える