2013-08-23 2 views
0

다음 배열이 있습니다.단어를 뒤집어서 필드를 효율적으로 검색하려면 어떻게해야합니까?

$arr = array('foo','bar','foo-bar','abc','def','abc-def','ghi','abc-def-ghi'); 

배열에 추가할지 여부를 결정하는 새 문자열이 제공됩니다. 문자열이 이미 배열에 있으면 추가하지 마십시오. 현재 양식의 배열에 있지 않지만 뒤집힌 단어 양식이있는 경우 추가하지 마십시오.

어떻게해야합니까?

예 :

'foo'  —-> N - Do NOT add, already found 
'xyz'  —-> Y - Add, this is new 
'bar-foo' —-> N - Do NOT add, already found in the flipped form 'foo-bar' 
'ghi-jkl' —-> Y - Add, this is new 

당신은 무엇을 권장합니까?

+0

한 빠른 생각이 알파벳순으로한다/배열에 추가하기 전에 값을 정렬합니다. – Ryan

답변

1

에 따라 수행 할 작업을 확인할 수 있습니다 그 요소 ('ABC', 'GHI'등)을 다른 순서에 포함 된에만 환입하지 아니합니다 TEMS, 당신은 할 수 :

$arr = array('foo','bar','foo-bar','abc','def','abc-def','ghi','abc-def-ghi'); 

function split_and_sort($str) { 
    $partsA = explode('-', $str); 
    sort($partsA); 
    return $partsA; 
} 
$arr_parts = array_map('split_and_sort', $arr); 

$tests = array('foo','xyz','bar-foo','ghi-jkl'); 
$tests_parts = array_map('split_and_sort', $tests); 

foreach($tests_parts as $test) { 
    if(!in_array($test, $arr_parts)) { 
     echo "adding: " . join('-', $test) . "\n"; 
     $arr[] = join('-', $test); 
    } 
    else { 
     echo "skipping: " . join('-', $test) . "\n"; 
    } 
} 
var_export($arr); 

출력한다 :

skipping: foo 
adding: xyz 
skipping: bar-foo 
adding: ghi-jkl 
array (
    0 => 'foo', 
    1 => 'bar', 
    2 => 'foo-bar', 
    3 => 'abc', 
    4 => 'def', 
    5 => 'abc-def', 
    6 => 'ghi', 
    7 => 'abc-def-ghi', 
    8 => 'xyz', 
    9 => 'ghi-jkl', 
) 
1

는 Heres는 당신이 시도 할 수있는 하나의 방법 ... $의 편곡의 각 문자열에 대한

, 다른 배열에 푸시로 역에 제안 ...

다음

rev_arr $라고

$new_array = array(); 

foreach ($arr as $arr_1) $new_array[$arr_1] = true; // just set something 

foreach ($rev_arr as $arr_2) $new_array[$arr_2] = true; // do also for reverse 
당신이 난을 제외 할 경우

지금 당신은 당신이

if (isset($new_arr[ $YOUR_TEST_VARIABLE_HERE ])) { // match found 
} 
관련 문제