Как проверить совпадение части строки с любым элементом массива

NBK

Новичок
есть массивы и обработка

PHP:
$NOSAVE['1']=Array("ттт1","ттт2","ттт3","ттт4","ттт4","ттт5");
$NOSAVE['2']=Array("ммм2","ммм3","ммм4","ммм5");
$NOSAVE['3']=Array(" 1аа "," 2аа "," 3ааl "," 5аа ");

#тут куча текста и получение огромнейшего массива строк $rowData

if ($rowData[0][0] != null and $rowData[0][6] != null and $rowData[0][15] > 1 ) {
  $data[$uid][]= array('1' => $rowData[0][0], '2' => $rowData[0][6], '3'=> $rowData[0][15] );
}
Нужно отсечь строки если в $rowData[0][6] есть элемент из одного из массива $NOSAVE[1] например.

Только регуляркой проверять, строковых вариантов (более быстрее будет) нет?
Не очень хочется городить и при обработке одного массива делать проверку с другим.
Да и вариантов if in array я не нагуглил.

Сейчас думаю в if который выше завернуть логику.
PHP:
if ($rowData[0][0] != null and $rowData[0][6] != null and $rowData[0][15] > 1 ) {
   foreach ( $nosave['1'] as $a=>$value) {
    if (!strpos($nosave['1'][$a],$rowData[0][6])){
    $data[$uid][]= array('1' => $rowData[0][0], '2' => $rowData[0][6], '3'=> $rowData[0][15] );
    }
  }
}
 

AnrDaemon

Продвинутый новичок
array_walk, array_map, php.net/array+functions
СНАЧАЛА читаем документацию, ПОТОМ изобретаем велосипед.
 

NBK

Новичок
Спасибо за намек в сторону модуля пытался его понять но в "callable" я не силен, а достаточно понятных примеров с ним, я не нашел что бы нормально разобраться.

Учитывая мою задачу "если 1 из элементов массива есть в строке" сделал через foreach + переменная.

PHP:
$dupd = False;
foreach ( $NOSAVE['1'] as $a=>$value) {
  if (strrpos($rowData[0][6],$NOSAVE['1'][$a])){
    $dupd = True;
  }
}
if (!$dupd){
  $data[$uid][]= array('1' => $rowData[0][0], '2' => $rowData[0][6], '3'=> $rowData[0][15] );
}else{
  $datano[$uid][]=$rowData[0];
}
 

antson

Новичок
Партнер клуба
можно заменить все плохие слова на пустое место в строке и проверить, если длина строки меньше , то там есть бяка
 

AnrDaemon

Продвинутый новичок
В общем случае, callable это просто имя функции, которая будет выполняться процессором.
Вот такой пример:
PHP:
function cb_trim(&$value, $key)
{
  if(is_string($value))
  {
    $value = trim($value);
  }
}

array_walk_recursive($_POST['item'], 'cb_trim');
 
  • Like
Реакции: NBK

NBK

Новичок
В общем случае, callable это просто имя функции, которая будет выполняться процессором.
Вот такой пример:
PHP:
function cb_trim(&$value, $key)
{
  if(is_string($value))
  {
    $value = trim($value);
  }
}

array_walk_recursive($_POST['item'], 'cb_trim');
Спасибо, еще раз тыкнули в функцию и этой ночью я ее догнал :).
И уже есть где пользовать, все таки импорт ексель прайсов в sql таблицу сделанную раком еще та задача.

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

Зато отлично подходит для прогона как раз идей любых изменений данных. сейчас только думаю как в него пихать из массива
PHP:
$array = array ( '0' => array ( 'first' => х1, 'sec' => второй, 'third' => 3),
                 '1' => array(  'first' => х12, 'sec' => вторник, 'third' => 34));
только данные $array[]['sec'] - но это уже к познаниям и пониманию в массивах и в данной функции, хотя намек уже есть, можно ведь запихнуть функцию в функцию ;)
 
Последнее редактирование:

NBK

Новичок
Да, я читал, но на текущий момент не могу понять как мне всунуть в функцию 1 массив а получить 2.
 

AnrDaemon

Продвинутый новичок
Во-первых, есть array_map. Она возвращает новый массив из результатов применения калбэка к элементам существующего массива. return null; тоже корректная формулировка, если что.
Во-вторых, можно строить массив через третий параметр array_walk, но это если надо очень забавные конструкции проворачивать.
 

NBK

Новичок
Да я обратил внимание что там чудить можно по разному. пока из подобного использовал такой вариант

PHP:
function utf8_to_cp1251($string) {
    if (is_array($string)){
        $string = array_map('utf8_to_cp1251',$string);
        return $string;
    }
    return mb_convert_encoding($string, "cp1251", "utf8");
    #return utf8_encode($decoded = utf8_decode($string)) === $string ? $decoded : iconv("utf8", "cp1251", $string);
}
$data[$uid] = array( '0' => array ( '1'=> ' текст раз', '2' => 'текст два', '3' => ' 10,50')
                     '1' => array ( '1'=> ' текст четыре', '2' => 'текст пять', '3' => '116,4'))
$data[$uid] = array_map('utf8_to_cp1251',$data[$uid]);
спокойно разгребает мой тип массива и меняет кодировку из utf8 в cp1251, хотя это элементарное из того что можно сообразить и с array_map и с array_walk.
 

AnrDaemon

Продвинутый новичок
return array_map(…)
return iconv(…)
Делать $a = array_map($a); вредно для здоровья.
Если тебе надо изменить исходный массив - сделай
PHP:
array_walk_recursive($arr, $f = function(&$v, $k){if(is_string($v))iconv(…);});
 

NBK

Новичок
Ну как я всегда знал... "пока полностью не понимаешь функции лучше не трогать", вот эти функции я логики полностью так и не понял, нужно будет как-то продумать функции и каунтеры всякие с echo и print_r() и на мелких массивах погонять, дабы понять что и как.
 
Сверху