Как я могу узнать, существует ли подстрока в строке с использованием PHP? - PullRequest
3 голосов
/ 01 июня 2011

Я знаю много вопросов, уже заданных по этой проблеме, но мне не удалось найти правильный ответ для моей конкретной проблемы.

У меня есть строка поиска - "1 | 1"

У меня есть массив, содержащий следующие значения - "a" => "1 | 1", "b" => "2 | 1,1 | 1", "c" => "3 | 2,2 | 1 «

Все, что я хочу сделать, это просто найти, существует ли строка поиска в массиве, она должна вернуть ключ массива. Если более чем один элемент массива имеет строку поиска, он должен вернуть все из них.

В этом примере я ожидаю получить и "a", и "b", но когда я использую strpos(), это дает мне только "a".

Как я могу решить эту проблему?

Изменить **

Это мой код

function array_search_i($str, $array)
{
    $returnArray = array();
    foreach ($array as $key => $value) {
        if (strpos($str, $value) !== false) {
            array_push($returnArray, $key);
        }
    }
    return $returnArray;
}

Ответы [ 8 ]

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

Просто используйте preg_grep .

print_r(preg_grep("/1\|1/", $array));
2 голосов
/ 01 июня 2011

Остерегайтесь оператора !==. Мы также должны проверить тип ..

$searchArray = array('2|2','1|1,3|3','1|1');
$search = '1|1';
foreach ($searchArray as $k=> $value) {
    if (strpos($value,$search) !== false) {
        $keysWithMatches[] = $k;
    }
}

print_r($keysWithMatches);
1 голос
/ 01 июня 2011
$keys = array();
foreach($a as $k=>$v){
    if(strpos($v,'1|1') !== false) $keys[] = $k;
}
0 голосов
/ 01 июня 2011

Вы можете использовать array_keys с параметром search_value для поиска всех значений в массиве.

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

<?php
$searchArray = array('2|2','1|1','1|1');
$search = '1|1';
print_r(array_keys($searchArray, $search));
?>

(ИЛИ)

В этом примере будут получены ключи всех частичных значений

<?php
foreach($array as $key => $val) {
   if(strpos($val,'green') !== false) {
      $resKeys[] = $key;
   }
}

print_r($resKeys);
?>
0 голосов
/ 01 июня 2011

array_filter () - это то, что вам нужно. Попробуйте следующий код.

$array = array("a"=>array("1|1"), "b"=>array("2|1","1|1"), "c"=>array("1|2"));
var_dump(array_keys(array_filter($array, function ($elem) { return in_array('1|1', $elem); } )));

OUTPUT

array(2) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
}
0 голосов
/ 01 июня 2011

Вот, пожалуйста,

<?php
    $array = Array("a" => "1|1", "b" => "2|1,1|1","c" => "3|1,2|1","d" => Array("a1" => "1|1"));
    array_walk($array,"find");

    function find($value, $key) {
        if (!is_array($value)) {
            if (preg_match("/\b1\|1\b/i",$value)) {
            echo $key .'<br />';
            }
        }
        else {
            array_walk($value,"find");
        }
    }
?>

. В этом примере вы получите:

a
b
a1
0 голосов
/ 01 июня 2011

Самым простым способом, который я могу придумать, является использование нативной функции PHP array_key () .

Вот как это работает:

$array = array("a" => "1|1", "b" => "2|1,1|1", "c" => "3|2,2|1");

$result = array_keys($array,'1|1');

print_r($result);
// 'a' => '1|1'

UPDATE:

print_r($array[$result[0]]); // Makes more sense.
                             // '1|1'
0 голосов
/ 01 июня 2011

strpos будет только «Найти позицию первого вхождения строки».

Посмотрите на array_keys.Я думаю, что это будет ближе к тому, что вы хотите.В качестве альтернативы, если он не может выполнить «частичное сопоставление», что вам, вероятно, нужно, возможно, вам придется использовать array_map или array_filter.

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