2014-01-27 4 views
0

Как проверить, содержит ли строка элемент массива и возвращает индекс (целое число) соответствующего члена?Какой член массива содержит строку в PHP?

Скажем, моя строка это:

$string1 = "stackoverflow.com"; 
$string2 = "superuser.com"; 
$r = array("queue" , "stack" , "heap"); 

get_index($string1 , $r); // returns 1 
get_index($string2 , $r); // returns -1 since string2 does not contain any element of array 

Как я могу написать эту функцию в элегантной (короткий) и эффективный способ?

Я нашел функцию (выражение?), Которая проверяет, если строка содержит элемент массива:

(0 < count(array_intersect(array_map('strtolower', explode(' ', $string)), $array))) 

но это логическое значение. функция count() возвращает то, что я хочу в этом выражении?

Спасибо за помощь!

+0

Просто FYI, ваша одна линия не лучший код. Взрыв, преобразование и пересечение - это «тяжелые» действия над большой строкой/массивом, которые можно сделать проще :) – Martijn

ответ

0
function get_index($str, $arr){ 
    foreach($arr as $key => $val){ 
    if(strpos($str, $val) !== false) 
    return $key; 
    } 
return -1; 
} 

Демо: https://eval.in/95398

+0

Это возвращает только первый ключ массива. TS хочет (если я правильно понимаю) количество совпадающих элементов, а не только первый ключ. Кроме того, в моем коде см. 'Break;'. – Martijn

+0

Я хочу индекс. Извините, если я неправильно сформулировал проблему. Этот ответ - именно то, что я ищу. Хотя я не тестировал других, спасибо за все ответы! – jeff

+0

Это вернет только клавишу FIRST. Если вы хотите все ключи, вы можете использовать мою функцию с небольшим изменением. – Martijn

0

Найдет количество совпадающих элементов в массиве, если вы хотите, чтобы все соответствующие ключи, используйте комментируемые линии вместо:

function findMatchingItems($needle, $haystack){ 
    $foundItems = 0; // start counter 
    // $foundItems = array(); // start array to save ALL keys 
    foreach($haystack as $key=>$value){ // start to loop through all items 
     if(strpos($value, $needle)!==false){ 
      ++$foundItems; // if found, increase counter 
      // $foundItems[] = $key; // Add the key to the array 
     } 
    } 
    return $foundItems; // return found items 
} 

findMatchingItems($string1 , $r); 
findMatchingItems($string2 , $r); 

Если вы хотите, чтобы вернуть все соответствующие ключи, просто измените $foundItems на массив и добавьте ключи в if-statement (переключитесь на прокомментированные строки).

Если вы хотите знать, если что-то соответствует или не

function findMatchingItems($needle, $haystack){ 
    if(strpos($value, $needle)!==false){ 
     return true; 
     break; // <- This is important. This stops the loop, saving time ;) 
    } 
    return false;// failsave, if no true is returned, this will return 
} 
-1

Я хотел бы сделать функцию как это:

function getIndex($string, $array) { 
    $index = -1; 
    $i = 0; 
    foreach($array as $array_elem) { 
     if(str_pos($array_elem, $string) !== false) { 
      $index = $i; 
     } 
     $i++; 
    } 
    return $index; 
} 
+0

Хотя это работает, я не думаю, что TS означает получить индекс, а скорее количество совпадающих элементов. – Martijn

+0

Также вы теперь запускаете '$ i ++', которые могут быть неверными. Если у вас есть ключи от A до Z, ключ 7 ничего не значит :) Я предлагаю метод '($ array as $ key => value)' и возвращает '$ key'. – Martijn

+0

Ха-ха, также: см. Мой ответ, последний пример, а затем 'break;' – Martijn

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