2014-10-21 2 views
-1

Я ищу функцию, которая находит ключи массива с похожими именами и переименовывает их.Найдите ключи Array с похожими именами и переименуйте его

Пример:

Array('Joes house' => 'some text', 'Joe`s House' => 'more Text', 'Bob' => 'text...') 

Результат:

Array('New Key' => 'some text', 'New Key' => 'more Text', 'Bob' => 'text...') 

я думаю о смеси этих функций:

array_keys($array) 
similar_text($word1' $word2) 

В цикл по каждому элементу.

Любые идеи? Спасибо большое!

EDIT:

В первом посте я забыл, что есть суб-массив внутри моего массива ... Я построил свою функцию в настоящее время. Это хороший способ сделать эту работу или есть более эффективный способ?

$array = array('Joe\'s House' => array('ABB', 'CDE'), 'Joes Pizza' => 'GDU', 'Jims House' => 'RDS', 'Joe Horse' => 'ABB', 'Joes Housee' => 'HCT'); 

echo "<pre>Original "; 
print_r($array); 
echo "</pre>"; 

$keys = array_keys($array); 
$first = null; 
$filter = array(); 
$add = array(); 

foreach($keys as $key) { 
    foreach($keys as $check) { 
     similar_text($key, $check, $percent); 
     if($percent > 90 && $key != $check) { 
      //Buffer first similar array key 
      if(empty($first)) { 
       $first = $key; 
      } 
      // build filter array 
      $filter[$check] = $array[$check]; 
      // build add array 
      if(is_array($array[$check])) { 
       $add[$first] = array_merge($add[$first], $array[$check]); 
      } 
      else { 
       $add[$first][] = $array[$check]; 
      } 
     } 
    } 
} 

$array = array_diff($array, $filter); 
$result = array_merge($array, $add); 

echo "<pre>To delete "; 
print_r($filter); 
echo "<pre>To add "; 
print_r($add); 
echo "Final filtered "; 
print_r($result); 
echo "</pre>"; 

Выход выглядит следующим образом:

Original Array 
(
    [Joe's House] => Array 
     (
      [0] => ABB 
      [1] => CDE 
     ) 

    [Joes Pizza] => GDU 
    [Jims House] => RDS 
    [Joe Horse] => ABB 
    [Joes Housee] => HCT 
) 

To delete Array 
(
    [Joes Housee] => HCT 
    [Joe's House] => Array 
     (
      [0] => ABB 
      [1] => CDE 
     ) 

) 

To add Array 
(
    [Joe's House] => Array 
     (
      [0] => HCT 
      [1] => ABB 
      [2] => CDE 
     ) 

) 

Final filtered Array 
(
    [Joes Pizza] => GDU 
    [Jims House] => RDS 
    [Joe Horse] => ABB 
    [Joe's House] => Array 
     (
      [0] => HCT 
      [1] => ABB 
      [2] => CDE 
     ) 

) 
+1

Вы можете определить аналогично в вашем случае? – Dinistro

+0

В моем примере это аналогичный случай. В противном случае Joe's House ans Bob Dole - это совершенно разные строки. –

ответ

0

Может быть что-то вроде:

$array = array('Joes house' => 'some text', 'Joe`s House' => 'more Text'); 
$keys = array_keys($array); 
foreach($keys as $key) { 
    $key_size = strlen($key); 
    foreach($keys as $check) { 
     if(((similar_text($key, $check)/$key_size) * 100) > 80 && $key != $check) { 
      echo '80% MATCH!'; 
      //Create new array item 
      $array['new_key'] = $array[$check]; 
      //Delete old array item 
      unset($array[$check]); 
     } 
    } 
} 
+0

Ницца! И как я могу переименовать ключи внутри моего массива? –

+0

Добавлено новое изменение для этого – DrRoach

+0

Именно это я и пытался сделать. Прекрасно работает! –

 Смежные вопросы

  • Нет связанных вопросов^_^