«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2018/07/30 11:16:38  №1237663 1
В общем я заебался и не понимаю логики.

Есть массив примерно такой: $array = [1,2,3,4,5,]

Как вывести сумму некоторых его элементов?
например 1 и 5го?

Эта ебучая array_sum может складывать только все элементы.

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

Ответы: >>1237667
Аноним 2018/07/30 11:19:58  №1237667 2
Ответы: >>1237669 >>1237673
Аноним 2018/07/30 11:23:33  №1237673 3
>>1237667
Пиздец, шатала это все.

Так просто это было и даже это я не смог сделать сам.

Ебал я нахуй это все.
Мой удел кидать мешки и коробки похоже.
Аноним 2018/07/30 14:13:01  №1237755 4
>>1237673

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

Дан массив слов. Надо вывести их в несколько строк, так, что в каждой строке собраны слова, начинающиеся с одной и той же буквы.

На входе: список слов: кот, собака, кит, сова
На выходе:

- кот, кит
- собака, сова

Если решишь эту, можешь попросить еще задачку. И так пока не начнешь понимать, как работать с массивами.
Ответы: >>1237823 >>1243210
Аноним 2018/07/30 16:53:25  №1237823 5
>>1237755
$array = ['кот', 'собака', 'кит', 'сова'];

$a = $array[0] . $array[2];
$b = $array[1] . $array[3];

echo $a;
echo $b;

Только я не пойму как разделение между словами сделать а то у меня слитно все выводится.
Ответы: >>1237831 >>1237877
Аноним 2018/07/30 17:06:33  №1237831 6
>>1237823
>Только я не пойму как разделение между словами сделать а то у меня слитно все выводится.
Вот с костылями, например:
$a = $array[0] . ' ' . $array[2];
$b = $array[1] . ' ' . $array[3];

А вот без костылей:
$a = "$array[0] $array[2]";
$b = "$array[1] $array[3]";
Ответы: >>1237833
Аноним 2018/07/30 17:09:14  №1237833 7
>>1237831
Точно, не то использовал, надо было . ' ' . а не просто точку.

Спс.
Ответы: >>1237853
Аноним 2018/07/30 17:33:19  №1237853 8
>>1237833
А ты понимаешь в чем разница?
Ответы: >>1237986
Аноним 2018/07/30 17:58:01  №1237877 9
>>1237823

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

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

Чтобы вывести названия из массива через запятую, можно использовать implode().
Ответы: >>1237988
Аноним 2018/07/30 20:05:59  №1237986 10
Аноним 2018/07/30 20:06:56  №1237988 11
>>1237877
>То есть если я поменяю список животных на входе, программа должна сама их отсортировать, а у тебя этого нету.

Даже не представляю как это сделать.
Ответы: >>1238006
Аноним 2018/07/30 20:41:55  №1238006 12
>>1237988

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

$byLetter = [
'к' => ['кот'],
'с' => ['собака', 'сова']
];

- мы берем очередное слово из входных данных
- определяем его первую букву
- проверяем, есть ли в byLetter ключ с такой буквой
- если нет - создаем его и кладем туда пустой массив
- добавляем слово в массив под этим ключом

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

Задавай вопросы, если что-то непонятно.

Попроси задачку посложнее, когда решишь.
Ответы: >>1238138
Аноним 2018/07/31 06:48:24  №1238138 13
Аноним 2018/08/08 18:04:09  №1243210 14
>>1237755
КОроче, решил с О(n^2) епта
$arr = [...some animals...];
$count = count(arr);
$str = '';
for($i=0;$i<count; $i++){
$str = $arr[$i][0];
for($j = $i+1; $j < $count; j++){
if($arr[$i][0] == $arr[j][0])
$str .= " $str[$j];
}
echo $str . '\n';
$str = '';
}
Ответы: >>1243228 >>1243238 >>1243949
Аноним 2018/08/08 18:27:53  №1243228 15
>>1243210
foreach чтобы перебирать массивы.
Аноним 2018/08/08 18:33:10  №1243238 16
>>1243210
Не страшно, я решаю задачки которые уже решал в прошлом и туплю, хотя раньше не тупил и с ходу делал так, что ОП сразу писал - верно, главное не загоняться.
Аноним 2018/08/10 03:54:34  №1243949 17
>>1243200

Нет, конечно. Формы предназначены для работы с HTML формами. Тебе нужен сериализатор/десериализатор JSON.

Когда у меня была обратная задача - преобразовать объект в JSON - я нашел сериализаторы неудобными. Они, например, по умолчанию экспортируют все поля сущности, и можно помечать те, что экспортирвать не надо. Но это плохой подход, так как легко забыть пометить поле и отдать какие-то приватные данные через API. Должно быть наоборот. Также, они заточены на сценарий, когда тебе надо преобазовать сущность в JSON целиком, но на практике часто нужна только часть полей, плюс какие-то дополниетельные свойства, которые вычисляются через методы. По факту было проще вручную их разобрать.

>>1243273

Если поле имеет тип int, то естественно, строки в него записывать нельзя.

>>1243270

> $correctText = str_replace(" ", "", $number);
> $correctText = str_replace("-", "", $correctText);
> $correctText = str_replace("(", "", $correctText);
тут стоит использовать единственный preg_replace либо strtr с массивом.

> "(\\+7)"
Скобки не нужны

> (-|\\s|\\(|\\)
Можно было написать короче как "[\\-\\s()]"

А так, верно.

>>1243210

Тут не нужно O(N^2), хватит O(N).

> for($i=0;$i<count; $i++){
> $str = $arr[$i][0];

Смотри, как тут много скобок и знаков доллара. Это тяжело читать. Надо использовать в такой ситуации цикл foreach. Если ты изучал другой язык и там был for, то забудь про него, в PHP есть foreach для обхода массива.

Не надо называть переменные $arr, так как это ничего не значит. Называй animals или words.

> $arr[$i][0]
Это не вернет первую букву, а первый байт в слове. Строка в PHP - это набор байт, а не символов и $str[0] не вернет тебе первый символ. Почитай урок https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

Наконец, твой алгоритм можно упростить. Нужно обойти слова и создать их них массив вида:

[
'а' => [...],
'б' => [...],
...
]

То есть массив, где ключ - это первая буква, а значение - это массив слов на эту букву. Тогда хватит O(N).
Ответы: >>1244310 >>1244650
Аноним 2018/08/10 13:32:32  №1244310 18
>>1243949
>Когда у меня была обратная задача - преобразовать объект в JSON - я нашел сериализаторы неудобными. Они, например, по умолчанию экспортируют все поля сущности, и можно помечать те, что экспортирвать не надо. Но это плохой подход, так как легко забыть пометить поле и отдать какие-то приватные данные через API. Должно быть наоборот. Также, они заточены на сценарий, когда тебе надо преобазовать сущность в JSON целиком, но на практике часто нужна только часть полей, плюс какие-то дополниетельные свойства, которые вычисляются через методы. По факту было проще вручную их разобрать.

Ну у меня и такая задача тоже есть. Взять тот же тестхаб, есть тест как сущность для админа или создателя (с указанием правильных ответов) и тест как сущность для участвующего или студента (без указания правильных ответов). Я думаю просто потом по группам раскидать.
Я еще встречал в ларавел вот такую штуку:
https://fractal.thephpleague.com/transformers/
она вроде бы удобная, но я её не применял на практике. Можно ведь самому сделать некий сервис, который будет принимать параметром сущность, и возвращать массив с данными, которые уже нужно преобразовать в джсон, то есть то что ты и говорил, мы не добавляем в "черный" список например пароль, а добавляем все кроем пароля в "белый" список
Ответы: >>1244650
Аноним 2018/08/11 07:36:51  №1244650 19
>>1243949
Какая-то устаревшая информация по сериалайзеру.

> Они, например, по умолчанию экспортируют все поля сущности, и можно помечать те, что экспортирвать не надо.

Группы в сериалайзере были давным давно: https://symfony.com/blog/new-in-symfony-2-7-serialization-groups
А до этого было принятно использовать JMS Serializer c их @ExclusionPolicy и @Expose: https://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies

> Также, они заточены на сценарий, когда тебе надо преобазовать сущность в JSON целиком, но на практике часто нужна только часть полей, плюс какие-то дополниетельные свойства, которые вычисляются через методы.

Можно сделать свой нормалайзер и вычислять там то, что нужно: -
- http://mickadoo.github.io/symfony/2016/05/18/custom-symfony-normalizers.html
- https://thomas.jarrand.fr/blog/serialization/

>>1244310
> Можно ведь самому сделать некий сервис, который будет принимать параметром сущность, и возвращать массив с данными

В терминах symfony/serializer это называется нормализация и делается через кастомные нормалайзеры (ссылки выше).

Fractal тоже норм.

>>1244073
> Дрочите всякие инкапсуляции, абстрактные методы, интерфейсы,

Всё правильно делают, это позволит им устроится в хорошую контору с толковыми спецами и интересным стеком.