Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Найти и удалить значение массива
 
 автор: segazav   (09.05.2014 в 17:03)   письмо автору
 
 

Хочу создать удаление предлогов из массива.

Пробовал так, но почему, то остается только одно значение массива 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);

  Ответить  
 
 автор: Yuriev   (09.05.2014 в 18:13)   письмо автору
 
   для: segazav   (09.05.2014 в 17:03)
 

Здесь if ($arr2[$i] = "и" or $arr2[$i] и далее должно быть "==", а не "=", а тут $i<=count($arr2) знак "=" совсем не нужен

  Ответить  
 
 автор: man1   (10.05.2014 в 04:37)   письмо автору
 
   для: 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'насосы для воды с номера десять по номер шесть из америки'));

  Ответить  
 
 автор: confirm   (10.05.2014 в 06:29)   письмо автору
 
   для: 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. Изучайте и пользуйтесь.

  Ответить  
 
 автор: Yuriev   (10.05.2014 в 14:41)   письмо автору
 
   для: confirm   (10.05.2014 в 06:29)
 

Почему-то так
$rep = ['и', 'для', 'на', 'под', 'из', 'с', 'по', 'о', 'об'];
у меня не стало работать.
Может сделать так
$rep = array('и', 'для', 'на', 'под', 'из', 'с', 'по', 'о', 'об');

  Ответить  
 
 автор: confirm   (10.05.2014 в 14:59)   письмо автору
 
   для: Yuriev   (10.05.2014 в 14:41)
 

Опускать объявление array у массива стало возможным с версии РНР 5.4. Значит у вас версия ниже.

  Ответить  
 
 автор: Yuriev   (10.05.2014 в 15:47)   письмо автору
 
   для: confirm   (10.05.2014 в 14:59)
 

Точно, у меня верси 5.3.ххх

  Ответить  
 
 автор: man1   (11.05.2014 в 17:02)   письмо автору
 
   для: confirm   (10.05.2014 в 06:29)
 

Хотите сказать, что с таким кодом легко работать?

Поймите, написать код, понятный для машины - может любой. А вот написать код, понятный человеку - это искусство.

В данном случае, создатель темы - новичок и только постигает самые азы языка, а Вы ему сразу даете малопонятную мешанину. Весь смысл в том, чтобы человек понял как все работает , а не просто написать готовое решение.

В моем посте все специально написано просто и предельно ясно - разобраться в коде сможет любой желающий, открыв php.net в соседней вкладке.

Кстати говоря, использовать новый синтаксис объявления массивов "[]", давая советы, не есть хорошо. По крайней мере, не зная какая версия пхп стоит у человека на машине

  Ответить  
 
 автор: confirm   (11.05.2014 в 17:11)   письмо автору
 
   для: man1   (11.05.2014 в 17:02)
 

Ну да, гонять циклы, это вершина искусства.

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

Объявлять массив не array(), а [], это уже привычка, пишется уже механически, но может эта моя "наглость" тоже будет предлогом заглянуть в руководство.

  Ответить  
 
 автор: psychomc   (11.05.2014 в 17:34)   письмо автору
 
   для: 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 и быстрее и читабельнее

  Ответить  
 
 автор: man1   (11.05.2014 в 21:54)   письмо автору
 
   для: psychomc   (11.05.2014 в 17:34)
 

>неумение пользоваться операторами и стандартными функциями языка - искусство...какой-то квадрат Малевича получается
>? вы такой же новичек как и автор
Да Вы остряк прямо, сударь. Вам же ясно объяснили, что был показан простой пример для новичка, и этот пример гораздо более читаем, чем соседний пример от нашего коллеги.

>p.s раз хотели показать как сделать просто, на кой черт там вообще 3й массив, почему так не сделать:
У полученного Вами массива в индексах будут "пробелы". Не знаю насколько это критично автору, но мне лично такой вариант не нравится. Дело вкуса.

>а почему strlen а не empty?
Здесь это не критично. Но использовать можно, согласен.

  Ответить  
 
 автор: psychomc   (11.05.2014 в 22:59)   письмо автору
 
   для: man1   (11.05.2014 в 21:54)
 

>Да Вы остряк прямо, сударь. Вам же ясно объяснили, что был показан простой пример для новичка, и этот пример гораздо более читаем, чем соседний пример от нашего коллеги.
да, только совсем неэффективен, если будут действительно большая стока

>У полученного Вами массива в индексах будут "пробелы". Не знаю насколько это критично автору, но мне лично такой вариант не нравится. Дело вкуса.
это как раз совсем не проблема, есть array_values. да и то, это актуально только если вдруг этот массив будут обходить с помощью for, который кстати медленее чем foreach

>Здесь это не критично. Но использовать можно, согласен.
нет, если только речь не идет о искусстве. хороший код должен быть и читабельным и эффективным

  Ответить  
 
 автор: confirm   (12.05.2014 в 05:29)   письмо автору
 
   для: 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


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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования