如何有效地搜索字段以翻转单词顺序?

时间:2013-08-23 23:50:48

标签: php arrays unique

我有以下数组。

$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

你推荐什么?

2 个答案:

答案 0 :(得分:1)

对你可以尝试的一种方式提出建议......

对于$ arr中的每个字符串,将其反转为另一个名为$ 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
}

答案 1 :(得分:1)

如果要排除其元素('abc','ghi'等)包含在另一个订单中而不仅仅是颠倒的项目,您可以这样做:

$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',
)