|
|
|
| Хочу создать удаление предлогов из массива.
Пробовал так, но почему, то остается только одно значение массива Array ( [2] => воды ):
$slova = "насосы для воды";
$arr2 = explode(" ",$slova); // Заносим слова в массив
for ($i=0; $i<=count($arr2); $i++)
{
if ($arr2[$i] = "и" or $arr2[$i] = "для" or $arr2[$i] = "в" or $arr2[$i] = "на" or $arr2[$i] = "под" or $arr2[$i] = "из" or $arr2[$i] = "с" or $arr2[$i] = "по" or $arr2[$i] = "о" or $arr2[$i] = "об")
{
unset($arr2[$i]);
}
}
print_r($arr2);
|
| |
|
|
|
|
|
|
|
для: segazav
(09.05.2014 в 17:03)
| | Здесь if ($arr2[$i] = "и" or $arr2[$i] и далее должно быть "==", а не "=", а тут $i<=count($arr2) знак "=" совсем не нужен | |
|
|
|
|
|
|
|
для: segazav
(09.05.2014 в 17:03)
| | Ужас.
<?php
function clearArrayFromStopWords(array $words_to_delete, $words) {
if (empty($words_to_delete)) {
return $words;
}
if (!strlen($words)) {
return '';
}
$words = explode(' ', $words);
$clean_words = array();
foreach ($words as $word) {
if (in_array($word, $words_to_delete)) {
continue;
}
$clean_words[] = $word;
}
return $clean_words;
}
$words_to_delete = array('и', 'для', 'на', 'под', 'из', 'с', 'по', 'о', 'об');
var_dump(clearArrayFromStopWords($words_to_delete, 'насосы для воды с номера десять по номер шесть из америки'));
|
| |
|
|
|
|
|
|
|
для: man1
(10.05.2014 в 04:37)
| | То что вы написали не менее ужасно.
<?
$rep = ['и', 'для', 'на', 'под', 'из', 'с', 'по', 'о', 'об'];
//для cp1251
$s = str_replace($rep, '', $s);
//для utf - mb_eregi_replace, preg_replace
//используя массив
$s = implode(' ', array_map(function($v) use($rep) {
return in_array($v, $rep) ? null : $v;
}, array_diff(array_map('trim', explode(' ', $s)), [null])));
|
Кроме этого существуют функции обхода массива - array_walk и array_walk_recursive. Изучайте и пользуйтесь. | |
|
|
|
|
|
|
|
для: confirm
(10.05.2014 в 06:29)
| | Почему-то так
$rep = ['и', 'для', 'на', 'под', 'из', 'с', 'по', 'о', 'об'];
у меня не стало работать.
Может сделать так
$rep = array('и', 'для', 'на', 'под', 'из', 'с', 'по', 'о', 'об'); | |
|
|
|
|
|
|
|
для: Yuriev
(10.05.2014 в 14:41)
| | Опускать объявление array у массива стало возможным с версии РНР 5.4. Значит у вас версия ниже. | |
|
|
|
|
|
|
|
для: confirm
(10.05.2014 в 14:59)
| | Точно, у меня верси 5.3.ххх | |
|
|
|
|
|
|
|
для: confirm
(10.05.2014 в 06:29)
| | Хотите сказать, что с таким кодом легко работать?
Поймите, написать код, понятный для машины - может любой. А вот написать код, понятный человеку - это искусство.
В данном случае, создатель темы - новичок и только постигает самые азы языка, а Вы ему сразу даете малопонятную мешанину. Весь смысл в том, чтобы человек понял как все работает , а не просто написать готовое решение.
В моем посте все специально написано просто и предельно ясно - разобраться в коде сможет любой желающий, открыв php.net в соседней вкладке.
Кстати говоря, использовать новый синтаксис объявления массивов "[]", давая советы, не есть хорошо. По крайней мере, не зная какая версия пхп стоит у человека на машине | |
|
|
|
|
|
|
|
для: man1
(11.05.2014 в 17:02)
| | Ну да, гонять циклы, это вершина искусства.
Нужно обязательно учить язык, нужно стараться понимать его, и ставить целью не копировать примеры из учебников, а думать над ними.
Объявлять массив не array(), а [], это уже привычка, пишется уже механически, но может эта моя "наглость" тоже будет предлогом заглянуть в руководство. | |
|
|
|
|
|
|
|
для: man1
(11.05.2014 в 17:02)
| | неумение пользоваться операторами и стандартными функциями языка - искусство...какой-то квадрат Малевича получается
p.s раз хотели показать как сделать просто, на кой черт там вообще 3й массив, почему так не сделать:
<?php
$words = explode(' ', $words);
foreach ($words as $key=>$word) {
if (in_array($word, $words_to_delete)) {
unset($words[$key]);
}
}
return $words;
|
? вы такой же новичек как и автор. а почему strlen а не empty?
<?php
if (empty($words_to_delete) || empty($words)) {
return $words;
}
|
empty и быстрее и читабельнее | |
|
|
|
|
|
|
|
для: psychomc
(11.05.2014 в 17:34)
| | >неумение пользоваться операторами и стандартными функциями языка - искусство...какой-то квадрат Малевича получается
>? вы такой же новичек как и автор
Да Вы остряк прямо, сударь. Вам же ясно объяснили, что был показан простой пример для новичка, и этот пример гораздо более читаем, чем соседний пример от нашего коллеги.
>p.s раз хотели показать как сделать просто, на кой черт там вообще 3й массив, почему так не сделать:
У полученного Вами массива в индексах будут "пробелы". Не знаю насколько это критично автору, но мне лично такой вариант не нравится. Дело вкуса.
>а почему strlen а не empty?
Здесь это не критично. Но использовать можно, согласен. | |
|
|
|
|
|
|
|
для: man1
(11.05.2014 в 21:54)
| | >Да Вы остряк прямо, сударь. Вам же ясно объяснили, что был показан простой пример для новичка, и этот пример гораздо более читаем, чем соседний пример от нашего коллеги.
да, только совсем неэффективен, если будут действительно большая стока
>У полученного Вами массива в индексах будут "пробелы". Не знаю насколько это критично автору, но мне лично такой вариант не нравится. Дело вкуса.
это как раз совсем не проблема, есть array_values. да и то, это актуально только если вдруг этот массив будут обходить с помощью for, который кстати медленее чем foreach
>Здесь это не критично. Но использовать можно, согласен.
нет, если только речь не идет о искусстве. хороший код должен быть и читабельным и эффективным | |
|
|
|
|
|
|
|
для: man1
(11.05.2014 в 21:54)
| | Может пора прекратить считать себя докой, а начинающих тупыми?
Для того чтобы понять вами написанное начинающий как минимум должен знать об этих разделах:
http://www.php.net/manual/ru/language.types.php
http://www.php.net/manual/ru/language.expressions.php
http://www.php.net/manual/ru/language.operators.php
http://www.php.net/manual/ru/language.control-structures.php
Судя по вашему коду, вы не совсем хорошо знакомы с этими разделами, ибо ваш код не в полной мере использует возможности, например, операторов.
Этот "новичок" знает, что есть нечто называемое массивом. А для работы с этим типом данных существует целый набор функций:
http://www.php.net/manual/ru/ref.array.php
Прочтите краткие пояснения к ним. Сложно? Вроде бы ничего туманного. А если заглянуть в описание их:
http://www.php.net/manual/ru/function.array-map.php
Ну совсем темный лес, да?
Например, если мне нужно подготовить строку запроса для обновления в таблице, и я напишу так:
<?
return 'UPDATE '.TABLE.' SET '.implode(',', array_map(function($key) {
return '`'.$key.'`=:'.$key;
}, array_keys($array))).($where ? ' WHERE '.$where : null);
|
Это так трудно для понимания, что кровь из носа и обязательно надо for/foreach, описывать каждую инструкцию отдельно, и смаковать красоту написания?
Если бы я при этом писал класс для работы с базой, то я бы повесился только от обилия конструкций с циклами в своем классе.
Например, возвращаем единственное значение таблицы, и пишем:
<?
$var = $q->fetch(); //PDO установлено возвращать объекты
echo $var->name;
|
Ничего страшного, все нормально. Но разве не проще сразу инициализировать $var значением, чтобы затем не писать далее везде $var->name:
<?
$var = $q->fetch(PDO::FETCH_NUM)[0];
|
Это звучит так - получить массив и взять его первый элемент. Или же нужно в аналогичной ситуации:
<?
//обязательно писать так:
$m = explode($n, $s);
$v = $m[0];
//а не проще:
$m = explode($n, $s)[0];
|
Так ли необходимо расписывать длинные инструкции, чтобы отсечь последний элемент массива, но при этом сохранив его, или же достаточно array_pop()?
Таких мелочей много, и можно гонять циклы по незнанию или еще чем либо заниматься, проку от этого мало, а куча лишних строк кода при этом никак не улучшает его "читабельность", да и контролировать такой код сложнее.
Ваш код, это не попытка объяснения, это ваша привычка так писать, не углубляясь в иные возможности. На то он и язык, чтобы учить его, а не ознакомившись с его разделом "Справочник языка" знать это как единственные его возможности. А не понять возможности языка можно только в одном случае - не интересоваться ими.
Вам psychomc уже заметил о ненужном массиве, но все таки пора бы знать, что бог знает какая древняя версия ругалась на отсутствие объявления массива, к которому обращаются в цикле. Давно уже не смертельно писать так:
<?
// без $array = array();
foreach(ext) {
$array[] = $var;
}
//и вуаля после цикла есть массив $array
|
Я писал код в большей мере для вас. И сперва таким, каким он и должен быть. Но потом "вклеил" в него избыток, и только ради того, чтобы в конце концов обратили внимание на наличие небольшого набора функций РНР, которые тем не менее позволяют решать большой спектр частых "повседневных" задач, а не париться "красотою" лишних и никчемных строк в коде. | |
|
|
|
|