В PHP: Как я могу отфильтровать подмножество одного массива в другой? - PullRequest
0 голосов
/ 16 декабря 2009
foreach ($myarray as $value)
  {
        if (strpos($value,'mysearchstring'))
             //add this $value to new array here
  }

Также, где будет объявлен второй массив и как?

Ответы [ 8 ]

8 голосов
/ 16 декабря 2009

Чтобы избежать предупреждений, второй массив должен быть объявлен как

$newArray = array();

Это может быть включено в ваш код следующим образом

$newArray = array();
foreach ($myarray as $value){
    if (strpos($value,'mysearchstring') !== false ){
         $newArray[] = $value;
    }
}

Ваш оригинальный код содержал ошибку. strpos возвращает и false, если не содержит иглу, в противном случае возвращает индекс вхождения. Так что strpos($value,'mysearchstring') вернет 0, если $value начинается с 'mysearchstring'. Поскольку PHP преобразует 0 в false и наоборот, он не будет добавлен в массив, если мы используем стандартные сравнения, поэтому нам нужно явно проверить, что он ложен без преобразования типов (преобразование 0 в false например). Для этого мы используем! == (Обратите внимание на два =) s. Это представлено в коде выше.

Дополнительную информацию об операторах сравнения в php см. В документации .

.

EDIT
Что касается комментария и использования [], он рекламирует новый элемент в конце массива

Документация гласит:

если ключ не указан [в квадратных скобках], берется максимум существующих целочисленных индексов, и новым ключом будет это максимальное значение плюс 1. Если целых индексов еще не существует, ключ будет равен 0 ( нуль).

Так что, если у нас есть массив

$arr = array(5 => 1, 12 => 2);

//doing this
$arr[] = 56;

//is exactly the same as doing
$arr[13] = 56

//As the maximum integer key is 12, so the new key is 13
4 голосов
/ 16 декабря 2009

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

function matches_string($value)
{
  return (strpos($value, 'mysearchstring') !== false);
}

$filtered_array = array_filter($my_array, "matches_string");
4 голосов
/ 16 декабря 2009
$newarray = array();

foreach ($myarray as $value) {
    if(strpos($value, 'mysearchstring') !== false) {
        $newarray[] = $value;
    }
}
1 голос
/ 16 декабря 2009

Вы можете даже использовать array_filter и функцию обратного вызова следующим образом:

$original = array('one','two','three','four','five');

$only_containing_o = array_filter($original, create_function('$string','return strpos($string, "o") !== false;'));

print_r($only_containing_o);
1 голос
/ 16 декабря 2009

Объявите новый массив перед циклом с конструктором array (). Вам нужно использовать! == false, потому что strpos вернет 0 (не логическое false), если строка поиска происходит в начале строки. Вы также можете использовать стрипы для поиска без учета регистра.

$new_array = array();
foreach ($myarray as $value)
  {
        if (strpos($value,'mysearchstring') !== false )
            $new_array[] = $value;
  }
1 голос
/ 16 декабря 2009

Вы можете объявить второй массив прямо перед foreach. Как это:

$secArray = array();
foreach ($myarray as $value)
{
    if (strpos($value,'mysearchstring')) {
        $secArray[] = $value;
    }
}

Оператор [] является псевдонимом для array_push.

С наилучшими пожеланиями,
Fabian

1 голос
/ 16 декабря 2009

Вам необходимо объявить ваш второй массив за пределами foreach. В противном случае он будет перезапускаться с каждой итерацией.

$matches = array();
foreach ($myarray as $value) {
    if (strpos($value,'mysearchstring') !== false) {
        $matches[] = $value;
    }
}

Также убедитесь, что вы используете безопасное сравнение типов с false , поскольку strpos может возвращать 0, если стрелка находится в начале строки.

1 голос
/ 16 декабря 2009
$array1 = array("jonathan", "joe", "david", "sampson");
$array2 = array();

foreach ($array1 as $name) {
  if (condition)
    $array2[] = $name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...