2013-12-07 2 views
-2

У меня есть строка, как "123456-1234-001-N" и массив $ids = array("123456-1234-002-N","123456-1234-001-S","4567789-4567-004-S","457896-14578-007-W")PHP скрипт, чтобы соответствовать данной части строки в массиве

Я хотел бы сравнить строки в массиве и выяснить, какие оставшиеся части струны не соответствуют Для например :

  • случай 1: 123456, 1234, и N присутствует в массиве, но в первом случае 001 не совпадают, и поэтому сообщение об ошибке брошено

  • case 2: 123456, 1234 и 001 присутствует в массиве, а второй случай N не соответствует, поэтому выдается сообщение об ошибке.

    Любая помощь приветствуется!

UPDATE 1: скрипт должен соответствовать всю строку в массив и ошибки отображения сообщения о том, как третий или четвертый барахло не соответствие. Например: мы можем использовать 123456 и 1234 строки и посмотреть, соответствует ли 001, или N соответствует. В основном мне нужно знать, соответствует ли третья/четвертая часть строки или нет.

ОБНОВЛЕНИЕ 2: Я выбрал второй метод из принятого ответа!

+0

«Я попытался использовать in_array() и preg_match() и не удалось». .. Не могли бы вы обновить свой вопрос своим кодом, чтобы мы могли вам помочь? – SuperSaiyan

+0

Вы пытаетесь получить точные соответствия (весь номер должен быть сопоставлен) или просто часть строки '$ search'? –

+0

@MaciejSz, пожалуйста, найдите мое редактирование, надеюсь, это убедительно ... – sree

ответ

1

Хорошо, к вашему последней правкой:

$search = "123456-1234-001-N"; 
$ids = array("123456-1234-002-N","123456-1234-001-S","4567789-4567-004-S","457896-14578-007-W"); 

$search_parts = explode('-', $search); 

foreach ($ids as $id) { 
    echo "Checking {$id}..." . PHP_EOL; 
    $id_parts = explode('-', $id); 
    $i = 0; 
    $is_correct = true; 
    foreach ($search_parts as $part) { 
     $part_no = $i + 1; 
     if ($part != $id_parts[$i]) { 
      $is_correct = false; 
      echo " part number {$part_no} is incorrect (is: {$id_parts[$i]}, should be: {$part});" . PHP_EOL; 
     } 
     $i++; 
    } 
    if ($is_correct) { 
     echo " This is a correct id!" . PHP_EOL; 
    } 
    echo PHP_EOL; 
} 

И то же самое (почти) сделано с preg_match:

$search = "123456-1234-001-N"; 

$search_pattern = '/^([0-9]*)\\-([0-9]*)\\-([0-9]*)\\-([A-Z]*)$/'; 
$ids = array("123456-1234-002-N","123456-1234-001-S","4567789-4567-004-S","457896-14578-007-W"); 

$search_parts = explode('-', $search); 
foreach ($ids as $id) { 
    $res = preg_match($search_pattern, $id, $matches); 
    if (! $res) { 
     throw new Exception("The id {$id} is in invalid format"); 
    } 
    $diff = array_diff($search_parts, $matches); 
    printDiffMessage($diff); 
    echo PHP_EOL . "----" . PHP_EOL; 
} 

function printDiffMessage(array $diff) 
{ 
    foreach ($diff as $key => $value) { 
     $pos = $key + 1; 
     echo "Keys differ at position {$pos}. "; 
    } 
} 

Назад (для справок):

Try Этот код:

$ids = array("123456-1234-002-N","123456-1234-001-S","4567789-4567-004-S","457896-14578-007-W"); 

$search = '123456-1234-001-N'; 

foreach ($ids as $single_id) { 
    $match = ''; 
    $i = 0; 
    foreach (str_split($search) as $chr) { 
     if ($single_id[$i] != $chr) { 
      break; 
     } 
     $match .= $chr; 
     $i++; 
    } 
    var_dump($match); 
} 

Это то, что вы пытаетесь сделать?

К вашему редактированию: похоже in_array - это то, что вам нужно.

if (in_array($search, $ids)) { 
    echo "Found it"; 
} 
else { 
    echo "Error message"; 
} 
+0

Спасибо за попытку, см. Обновленный вопрос ... дайте мне знать, если еще не ясно – sree

+0

wow это почти то, что я хотел, но, еще одна вещь , совпадение должно продолжаться только в том случае, если первая и вторая части совпадают, i, e, если 123456 и 1234, тогда только он должен продолжить проверку третьей и четвертой части, надеюсь, поняли? – sree

+1

Вы можете достичь этого (только с первым решением), добавив 'break;' после '$ i> = 1' в' '($ part! = $ Id_parts [$ i])' условие. По моему мнению, решение с использованием 'preg_match' является более надежным и чистым. –

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