«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2018/06/07 04:56:58  №1204435 1
Платина. Призываю к совету анонов, желательно с картофляндии. Окончил вышку(программист) и работаю на принудительной галере(недопрограммист на некроязыке) - осталось чуть больше года отсидеть. Понимание программирования немного есть, но навыки отсюда вряд ли пригодятся, может только sql немного. В универе пытался вкатиться, процентов 40 кантора освоил и немного пхп с вёрсткой поковырял. Свободного времени тут относительно много, поэтому планирую выучить за это время что-нибудь адекватное. Читаю уже много времени и ваши треды, и треды фронтендеров и не могу разобраться, куда двигаться, чтобы через полтора года не обосраться, одно только понял, что кроме веба за полтора года ничего не успею освоить на уровне джуна, смотрю ещё на питона немного, дайте совет. Пишу сюда, потому что в фронттреде мало адекватов и вопросов по делу, у вас хорошая атмосфера и вроде как все делом занимаетесь.
Ответы: >>1204454 >>1204483
Аноним 2018/06/07 06:44:17  №1204462 2
Поясните за функции работы с массивами, а если точнее за параметры этих функций. По какой логике они выстроены?
Вот, например, функция array_keys возвращает массив ключей, да? Первым параметром она принимает массив, а вторым значение, ключи которого(ых), нужно найти.
Тут где-то неподалёку есть функция array_search, которая возвращает первый ключ искомого значения. Но тут она уже первым параметром принимает значение, а вторым - массив.

Казалось бы, две похожие функции, но почему порядок параметров разный? Почему нельзя было все функции этого типа стандартизировать, чтобы, например, везде сначала шёл массив, а затем уже значение?
Почему везде всё по-разному?
Это я чего-то не понимаю, или это просто разработчики php не могут в согласованную работу? В чём сакральный смысл такого поведения?
И это ведь не единственный пример, есть куча функций, которые ищут что-то в чём-то и порядок параметров всегда хаотичный, не подчиняющийся логике.

А это порой жутко неудобно бывает.
Ответы: >>1204470 >>1204481 >>1204488
Аноним 2018/06/07 07:19:07  №1204481 3
>>1204462
Необязательные параметры идут в конце.
>Если указан необязательный параметр значение_для_поиска, функция возвращает только ключи, совпадающие с этим параметром. В обратном случае, функция возвращает все ключи массива исходный_массив.
Ответы: >>1204484
Аноним 2018/06/07 07:23:30  №1204483 4
>>1204435
>Окончил вышку(программист)
>и работаю на принудительной галере
>Понимание программирования немного есть
>кроме веба за полтора года ничего не успею освоить на уровне джуна
Ты дно, пили сюда свои проекты.
Ответы: >>1204502
Аноним 2018/06/07 07:24:48  №1204484 5
>>1204481
Ну тогда всё встаёт на свои места, спасибо.
Ответы: >>1204489
Аноним 2018/06/07 07:31:33  №1204489 6
>>1204484
Хотя, с другой стороны. В любом случае, функции для строк и для массивов имеют разный порядок аргументов.
Для строк сначала идёт haystack, а потом needle (как например в strpos), для массивов наоборот. Хотя оба аргумента обязательные.
Ну и названия методов тоже. array_search vs. strpos. Нелогично? Нелогично!

Я просто ньюфаня, и меня это немного путает (и пугает).
Ответы: >>1204538
Аноним 2018/06/07 07:42:55  №1204502 7
Ответы: >>1204538
Аноним 2018/06/07 09:01:03  №1204538 8
>>1204502
Плохова ответ!

>>1204489
Первым аргументом идет то что должно выдаться.
array_keys выдает массив.
array_search только первый ключ.
strpos позицию в строке.(Потому первая строка, а не искомый ключ)
>Нелогично?

Я сам нью, только позавчера начал основы читать.
Ответы: >>1204550 >>1204551
Аноним 2018/06/07 09:18:59  №1204551 9
>>1204538
Ну давай разберем по частям, тобою написанное ))

>Первым аргументом идет то что должно выдаться.
Смотрим:
array_search Осуществляет поиск данного значения в массиве и возвращает ключ первого найденного элемента в случае удачи (c php.net)
То есть што делает эта функция? Ищет в массиве искомое значение и возвращает первую позицию его. Да?

Теперь дальше:
strpos Возвращает позицию первого вхождения подстроки

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

Я так и не понял, что ты имел ввиду под
>Первым аргументом идет то что должно выдаться.

И в первой, и во второй функции возвращается int, который характеризует позицию первого найденного значения.

>Первым аргументом идет то что должно выдаться
>array_search только первый ключ
Мы ожидаем от функции индекс первого найденного элемента, поэтому первым аргументом передаём элемент, а вторым массив? Звучит логично.

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

>Первым аргументом идет то что должно выдаться
>strpos позицию в строке
Мы ожидаем от функции индекс первой найденной последовательности, поэтому первым аргументом передаем массив, в котором осуществляется поиск, а вторым уже искомый набор элементом.

>Нелогично?
Ответы: >>1204614
Аноним 2018/06/07 10:20:02  №1204614 10
>>1204551
>Мы ожидаем от функции индекс первой найденной последовательности, поэтому первым аргументом передаем массив, в котором осуществляется поиск, а вторым уже искомый набор элементом.
Не массив а строку!
Получаем позицию в строке. Но не подстроку, которую ищем.



array_search пользуемся для работы с искомым значением.
(И конечно же для работы с массивом т.к. значение вложенное в него, но прежде всего со значением)
strpos пользуемся для работы со строкой в которой находится последовательность.
(Прост работаем относительно последовательности)

>Нелогично?
Ответы: >>1204672
Аноним 2018/06/07 11:15:38  №1204672 11
>>1204614
>Не массив а строку!
Так ведь строка это и есть массив!
Строка - последовательность символов, массив - последовательность каких-то других данных.
В каком-нибудь C это вообще буквально так и есть.

И первая, и вторая функция используется для поиска значения в последовательности.
И первая, и вторая функция возвращает индекс первого найденного элемента по нашему запросу.

Будь это элемент в массиве или подстрока, какая разница? И там и там возвращается одно и то же.
Чем принципиально отличается индекс массива и позиция в строке? Это такое же число, равное отступу от начала этой последовательности.

Какая разница для чего нам нужна эта функция, если возвращаемое значение и там, и там несет в себе один смысл?

Окей, вот у нас есть строка мышь.
Мы пытаемся найти в ней "ш".

И спрашиваем, какой отступ у символа "ш" в последовательности символов мышь, относительно начала последовательности?
Получаем ответ - 2.

Теперь у нас есть массив ["м", "ы", "ш", "ь"].
Мы пытаемся найти в нём "ш".

И спрашиваем, какой отступ у элемента типа "строка" "ш" в последовательности элементов типа "строка" "м", "ы", "ш", "ь", относительно начала последовательности?
Получаем ответ - 2.

В чём принципиальная разница, которая бы отличала первую функцию от второй настолько, чтобы она стала достойна смены порядка аргументов?

Мы ищем что-то в чём-то. Ищем что-то в какой-то последовательности. Ищем позицию элемента какого-то типа в последовательности, состоящей из элементов данного типа.
Ну а потом, для чего нам может понадобиться узнать позицию последовательности в строке? Ну, например, для того, чтобы убедиться, что она там вообще есть, ну провести какие-то манипуляции с последовательностью.
Но и с массивом то же самое! Мы можем использовать функцию array_search как для того, чтобы убедиться, что массив есть, ну или чтобы провести какие-то манипуляции с этим элементом, т.е. по сути тоже с последовательностью, только состоящей из одного элемента (да и к тому же ничто не мешает использовать функцию для поиска некоего диапазона, чтобы потом работать с ним).

Может быть, я слишком глупый, но я этого не понимаю.
Ответы: >>1204682 >>1204740 >>1204758
Аноним 2018/06/07 11:25:44  №1204682 12
>>1204672
В итоге ты ищешь значение не само в себе, а для работы с чем-то.

Ты ищешь ключ значения в массиве для работы со значением.
Ты ищешь позицию в строке для работы со строкой.
Ответы: >>1204690
Аноним 2018/06/07 11:34:55  №1204690 13
>>1204682
>Ты ищешь ключ значения в массиве для работы со значением.

Я ищу номер значения, чтобы удалить его из последовательности, например.

unset($misch[array_search("ш", $misch)]);
substr_replace($misch, "", strpos($misch, "ш"), 1);

Конечно, это костыль, т.к. можно было использовать str_replace. Но я уверен, что внутри она так и работает.

И в первом и втором случае меня волнует только позиция значения для того, чтобы удалить её их последовательности. Ничего больше меня не волнует.
Ответы: >>1204692 >>1204706
Аноним 2018/06/07 11:52:22  №1204706 14
>>1204690
>Я ищу номер значения, чтобы удалить его из последовательности, например.
В примере ты ищешь позицию, чтобы внести правки в строку.
Ответы: >>1204707
Аноним 2018/06/07 11:53:06  №1204707 15
Ответы: >>1204712
Аноним 2018/06/07 11:56:03  №1204712 16
>>1204707
У тебя строка и является массивом.
Ответы: >>1204715
Аноним 2018/06/07 11:59:21  №1204715 17
>>1204712
Так строка это и есть массив. Что массив, что строка, в обоих случаях мы находим позицию, чтобы удалить элемент из последовательности.
Разницы нет. Нелогичность функций есть.
Не стоит наделять смыслом то, что смысла не имеет. Например, функции принимают аргументы в разном порядке из-за того, что потом со сторокой...
Функцию не должны волновать то, что кто-то будет делать с тем значением, которое она возвращает. Её задача принять параметр, обработать его и вернуть результат. Всё.
Ответы: >>1204726 >>1204740
Аноним 2018/06/07 12:16:20  №1204726 18
>>1204715
>мы находим позицию, чтобы удалить элемент из последовательности.
Не обязательно.

Индекс в множестве строк для работы с найденной строкой.
!==
Позиция в строке для работы с этой же строкой.

>Функцию не должны волновать
Функция сама должна волновать своим порядком аргументов.
>функции принимают аргументы в разном порядке из-за
внедренной логики программирования

>Разницы нет.
>Нелогичность функций есть.
>Не стоит наделять смыслом то, что смысла не имеет.
>Всё.
Ответы: >>1204736 >>1204740
Аноним 2018/06/07 12:23:29  №1204736 19
>>1204726
>Не обязательно.
Вот и именно, спасибо, что ты наконец-то это признал. Мы ищем отступ для чего угодно, задача функции вернуть нам этот отступ и всё.

>Индекс в множестве строк для работы с найденной строкой.
>!==
>Позиция в строке для работы с этой же строкой.
Но в то же самое время, индекс в массиве любых данных, необходимый для работы с этим же массивом (например, для удаления последовательности элементов.
===
Позиция в строке для работы с этой же строкой (например, для удаления последовательности).

Концептуально, конечно же, понятное дело, что типы разные.
Ответы: >>1204740 >>1204742
Аноним 2018/06/07 12:31:05  №1204740 20
>>1204736
>>1204726
>>1204715

Хватит засорять тред бессмысленным флудом. Недостатки PHP (и других языков) давно уже собраны и изучены, если хотите их обсудить, перемещайтесь сюда: https://habr.com/post/315152/

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

Также, в PHP строки это массивы байт, а не массивы символов. Например, $a = "абв"; echo $a[0]; в кодировках utf-8 или utf-16 НЕ выведет букву "a", так как строка в PHP это НЕ массив символов.

Соответственно объяснения в посте >>1204672 ошибочные и не учитывают этого.

Функции работы с массивами в PHP не будут работать со строками. Например, ты не можешь применить функцию array_sum или in_array к строке. И наоборот, функции работы со строками не работают с массивами.

Функция strpos называется так, потому, что это функция из старой сишной библиотеки работы с однобайтовыми строками и там принят такой стиль наименования. Сейчас в коде надо использовать mb_strpos, а не strpos.
Ответы: >>1204758
Аноним 2018/06/07 12:33:00  №1204742 21
>>1204736
>Мы ищем отступ
Нет.

Положение элемента
!==
Положение относительно элемента

Ответы: >>1204758
Аноним 2018/06/07 12:47:34  №1204758 22
>>1204742
>Положение элемента
Относительно чего? Не в воздухе же он болтается. Массив - это набор данных, расположенных последовательно в памяти. Следовательно, индекс элемента - это его смещение относительно начала.
Ровно как и в строке, позиция подстроки - это смещение относительно начала.

>>1204740
>Соответственно объяснения в посте >>1204672 ошибочные и не учитывают этого.
Окей, я ошибся с тем, что назвал массив байтов массивом символов. Ну и что с того? Строка перестала быть массивом? Нет, не перестала.
Я там говорил о том, что при помощи этих функций, что в массиве байтов, что в массиве символов, мы находим позицию вхождения последовательности или элемента.
Стало ли хоть одно моё утверждение ложным? Нет, не стало.

>Хватит засорять тред бессмысленным флудом
Я не флудить хочу, а разобраться.
Ответы: >>1204779 >>1204912
Аноним 2018/06/07 12:59:54  №1204779 23
>>1204758
>Следовательно, индекс элемента - это его смещение относительно начала
Короче, походу тут я ошибся. В PHP массив - это не совсем то, чем он является на самом деле. Это по своей сути хеш-таблица, поэтому индексы могут быть любыми.

То есть, не составит труда написать array([231] => "м", [717] => "ы", ...);
Тогда в этом случае, индексы уже ничего не означают.
Ответы: >>1204782 >>1204786 >>1204801
Аноним 2018/06/07 13:03:16  №1204786 24
>>1204779
Весь этот пердолинг на старых компах и неэффектинвых системах должен кучу времени отнимать у рабочих, нет денег на новое перейти - что производит завод?
Ответы: >>1204792 >>1204793
Аноним 2018/06/07 13:09:07  №1204792 25
Аноним 2018/06/07 13:11:01  №1204793 26
>>1204786
Ну там ограничение на числа и строки в качестве ключей.