Сортировка array1 по array2 с совпадениями ключей SIMILAR и без совпадений EXACT. - PullRequest
1 голос
/ 18 июня 2011

Я бы хотел, чтобы названия песен в $ Array2 сортировались в том же порядке, что и $ Array1, без потери значений из $ Array2. Значения из $ Array2 должны соответствовать новому порядку каждого ключа в $ Array2. Я считаю, что текущая функция, которую я предоставил, является надежным началом ...

У меня есть два массива (обратите внимание на различия в каждом):

  1. $ Array1 - введенные пользователем данные.
  2. $ Array2 - это данные, просмотренные как внешний источник, который похож на $ Array1, но не ТОЧНО.

Например ...

$ Array1 содержит:

Array
(
    [0] => 3oh!3 - Don't Trust me
    [1] => Taylor Swift - You Belong with me
    [2] => Sean Kingston - Fire Burning
    [3] => Green Day - Know Your Enemy
    [4] => Kelly Clarkson - Gone
)

$ Array2 содержит:

Array
(
    [Taylor Swift - You Belong With Me] => bbbbbb
    [Sean Kingston - Fire Burning] => cccccc
    [Kelly Clarkson - Gone] => eeeeee
    [3OH!3- Don't Trust Me lyrics] => aaaaaa
    [Green Day Know Your Enemy Official] => dddddd
)

У меня уже запущена функция, которую я нашел на этом сайте:

function sortArrayByArray(array $toSort, array $sortByValuesAsKeys)
{
    $commonKeysInOrder = array_intersect_key(array_flip($sortByValuesAsKeys), $toSort);
    $commonKeysWithValue = array_intersect_key($toSort, $commonKeysInOrder);
    $sorted = array_merge($commonKeysInOrder, $commonKeysWithValue);
    return $sorted;
}

Однако ...

$sortArray = sortArrayByArray($Array2, $Array1);
print_r($sortArray);

$sortArray возвращает только два результата:

Array
(
    [Sean Kingston - Fire Burning] => cccccc
    [Kelly Clarkson - Gone] => eeeeee
)

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

Вот решение:

<?php

$array1 = array(
  0 => '3oh!3 - Don\'t Trust me',
  1 => 'Taylor Swift - You Belong with me',
  2 => 'Sean Kingston - Fire Burning',
  3 => 'Green Day - Know Your Enemy',
  4 => 'Kelly Clarkson - Gone',
);

$array2 = array(
  'Taylor Swift - You Belong With Me' => 'bbbbbb',
  'Sean Kingston - Fire Burning' => 'cccccc',
  'Kelly Clarkson - Gone' => 'eeeeee',
  '3OH!3- Don\'t Trust Me lyrics' => 'aaaaaa',
  'Green Day Know Your Enemy Official' => 'dddddd'
);


// Find matching song titles (case insensitive).
$tmp = array_values(array_uintersect($array1, array_flip($array2), 'strcasecmp'));

if ( ! empty($tmp) )
{
  // Generate the array.
  $matches = array_flip(array_uintersect(array_flip($array2), $tmp, 'strcasecmp'));

  print_r($matches);
}
else
  echo 'No matches found.';

?>

Будет выведено:

Array
(
    [Taylor Swift - You Belong With Me] => bbbbbb
    [Sean Kingston - Fire Burning] => cccccc
    [Kelly Clarkson - Gone] => eeeeee
)

Другие 2 совпадения не идентичны на 100%.Как и предполагали другие, вы можете использовать similar_text() или другие функции, чтобы определить, насколько похожи две строки.Если вы хотите это сделать, вы можете изменить 'strcasecmp' в вызове array_uintersect и написать свою собственную функцию, которая использует similar_text (или другие функции), чтобы решить, будет ли или нетзначения фактически пересекаются или нет.

0 голосов
/ 18 июня 2011

Попробуйте использовать что-то вроде функций Левенштейна или Similar_text для сравнения строк в массивах. Вам просто нужно определить пороговое значение, которое максимально точно соответствует минимальному количеству ложных срабатываний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...