Имя: Пароль:
IT
Веб-мастеринг
Возможно ли сократить такую запись
, , , , , ,
0 Александр Тоха
 
14.09.18
17:18
как правильно перебрать такой массив, что бы в итоге получить значения нумератора...я немного в ступоре, никогда не наблюдал столько вложений.
$resData['catInfo']['children'][0]['event']['mainMarket']['selections']['Result.3']['count']['price']['numerator'];
Подскажите, помогите.
1 Доктор Кто
 
14.09.18
18:59
(0) $resData.catInfo.children[0].event.mainMarket.selections.['Result.3'].count.price.numerator;

только если так.
Можно еще с промежуточными перемпнными, но это для удобства, а не сокращение.
2 Asmody
 
14.09.18
19:34
JSON разбираешь?
А теперь представь, что в этой цепочке какого-то значения нет.
3 Asmody
 
14.09.18
19:36
В lodash для таких случаев есть функция _.get()
4 Доктор Кто
 
14.09.18
19:53
(0) О, есть один вариантик. Записать все ключи в массив:

const keys = ['catInfo', 'children', и т.д.];

потом сделать цикл по этому массиву, и вытащить по очереди значения:

const numerator = keys.reduce((acc, key) => acc[key], $resData)

В цикле уже можешь вставить любые проверки на существование такого элемента.
5 Доктор Кто
 
14.09.18
19:54
['catInfo']['children'] - это как я понимаю информация о детях кошки )))
6 Доктор Манхэттен
 
16.09.18
14:03
Более полный вариант с проверкой:

const get = (p, o) => p.reduce((xs, x) => (xs && xs[x]) ? xs[x] : null, o);
const numerator = get(['catInfo', 'children', и т.д.], $resData);
7 Доктор Манхэттен
 
16.09.18
14:11
Можно сделать отдельно функцию для получения нумератора:

const get = p => o =>
  p.reduce((xs, x) =>
    (xs && xs[x]) ? xs[x] : null, o);
const getNumerator = get(['catInfo', 'children', 0, и т.д.]);

А потом ее вызывать передавая только $resData, но не передавая каждый раз путь:

const numerator = getNumerator($resData);
8 Александр Тоха
 
16.09.18
18:10
(7) спасибо, но почему то перебором быстрее получается ( может баг (
9 Доктор Манхэттен
 
17.09.18
12:40
(8) Что значит перебором? На чем пишешь?
10 Александр Тоха
 
17.09.18
17:15
(9) постигаю все прелести функционального подхода на PHP и чуть-чуть ЖС, а до этого писал только на Autoit и Pawn )но это совсем другая история)
11 Asmody
 
17.09.18
17:42
(10) "прелести функционального подхода на PHP" - это изврат. Обязательно упрешься в язык. Хотя, чтобы это понять нужно самому реализовать простую монаду. И сразу станет понятно, что в традиционном ключе всё можно сделать проще.
А вот с javascript всё не так однозначно. Он позволяет писать достаточно выразительно в fp-стиле.
12 Александр Тоха
 
17.09.18
17:52
(11) устал от "бесконечных" ifов/switch и forов) хочется просто написать array_map вызвать обратную и вот ) да и нужно развивать себя,а то всё автокликалки пиксельпоиски. Благо сейчас живем в эпоху космических коммуникаций и всегда можно спросить у знающих, обидно одно-цены на чтиво очень кусаются
13 Asmody
 
17.09.18
18:03
Вот как-то так

<?php

function array_get_path($arr, $path) {
  $reducer = function($carry, $item) {
    //if (is_null($carry)) return null;
    if (is_array($carry) && array_key_exists($item, $carry)) {
      return $carry[$item];
    }
    return null;
  };
  return array_reduce($path, $reducer, $arr);
}


вот так использовать:

array_get_path($resData, ['catInfo', 'children', 0, 'event', 'mainMarket', 'selections', 'Result.3', 'count', 'price', 'numerator']);
14 Сияющий в темноте
 
17.09.18
18:39
Если у вас длинный путь вложенности массива,то как ни крути,его придется пройти,или,как вариант,менять создателя,чтобы путь был не таким уж и длинным.
15 Вафель
 
17.09.18
18:40
а откуда данные? может xpath какой там есть?
16 Asmody
 
17.09.18
22:04
(15) Это как пить дать результат json_decode($res, true). Нет там никакого xpath.

Кстати, в php есть чудесный символ @ - подавление ошибок в выражении. Специально для ленивых программистов. http://php.net/manual/ru/language.operators.errorcontrol.php Но злоупотреблять ею не стоит.
17 Александр Тоха
 
18.09.18
15:55
(16) Добрый день) Для себя открыл НЕЧТО - массив данных в пхп передается полностью...а не по ссылке, а как же тогда быть с большим массивом эдак в мульйон. Это получается, что при каждом использовании функций будет создана копия массива в памяти. Знатоки подсобите куда смотреть.
18 Доктор Манхэттен
 
18.09.18
16:06
(17) Лучше брось этот ПХП пока не поздно.

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

function foo(&$myArray) {
    тут тело функции
}
19 Asmody
 
18.09.18
16:09
20 Вафель
 
18.09.18
16:10
а как же
Начиная с PHP 5.4.0 передача переменной по ссылке стала невозможна, поэтому использование этого приема приведет к фатальной ошибке
21 Asmody
 
18.09.18
16:18
(20) Это не совсем корректный перевод. Имеется ввиду, что не нужно явно брать ссылку от переменной вида &$var при вызове функции. PHP сам разберется как передавать переменную в зависимости от того, как были объявлены параметры функции.
22 Александр Тоха
 
18.09.18
16:27
(21) я понял, что придется писать свои функции по работе с массивом, т.к. в ряде стандартных функций создается копия массива...печально
23 Asmody
 
18.09.18
16:35
(22) Насчет встроенных функций можно особо не заморачиваться. Там php сам "магически" разруливает.
24 Доктор Манхэттен
 
18.09.18
17:38
(22) Таки почему ты не хочешь уйти с PHP на более правильный или высокооплачиваемый язык? Как я понял, тебе пока нечего терять, не накопил опыта в PHP чтобы держаться за него зубами.
25 Александр Тоха
 
18.09.18
18:35
(24) я "бонусхантер" уже как 4 кода и мне приходится самому организовывать себе самому автоматизацию рабочих процессов из-за невозможности организовать автоматизацию на стороне. Ну как только встает вопрос масштабируемости приходится учить какой либо скриптовый язык(autoit, pawn). Сейчас мне нужна серверная часть и выбор пал на ПХП из-за низкого порога вхождения. Почти всю функционалку я могу реализовать на автоите, но там все упрется в скорость...Склоняю себя так же в сторону JS т.к. для меня js понятнее чем пхп, но устанавливать ноду и тыкать в нее палкой нет желания. Сразу хочу предупредить вопрос, насчет заплати, доверься специалистам - мой покерный бот для старзов написанный автоите был успешно портирован на C# и успешно слит в сеть.
26 Александр Тоха
 
18.09.18
18:46
*года
27 Доктор Манхэттен
 
18.09.18
19:15
(25) Какие проблемы с нодой? JS гораздо приятнее чем PHP.
Если нужен более низкий порог вхождения, то лучше выбрать Go.
Я бы на твоем месте выбрал JS, меньше бы тратил время на ковыряние в PHP.
28 Александр Тоха
 
18.09.18
19:29
(27) в чем преимущество node.js перед пхп ?
29 Александр Тоха
 
18.09.18
19:30
(27) конкретно в моей задаче, парсить/анализировать/ обрабатывать и отдавать на клиент
30 Asmody
 
18.09.18
19:52
(29) Вообще, парсинг парсингу рознь. Почему не Perl? Вот уж кто всем парсерам парсер.
Но лучше python или go.
31 Сияющий в темноте
 
18.09.18
20:50
А что мы вообще парсим?
может,задачу изначально нужно решать по другому.
php нормально работает с массивами,только нужно понимать,что многомерные массивы,это обьект в обьекте и все равно будет не быстро.
32 Доктор Манхэттен
 
18.09.18
21:21
(28) JS проще и логичнее чем PHP, и ты его уже знаещь. Экономия времени на понимание. Я уже писал.
33 Александр Тоха
 
20.09.18
23:15
(31) изначально по другому не получится.
34 Александр Тоха
 
20.09.18
23:15
(30) Вот очень много читал про python, но все так и не решаюсь опробовать его в деле. Думаете будет профитнее php в парсинге?
35 Asmody
 
21.09.18
00:00
(34) Смотря что парсить. Иногда можно парсить и без программирования https://netology.ru/blog/directgoogledocs
36 Александр Тоха
 
21.09.18
00:13
(35) да не, мне надо дергать большой объем данных такой способ точно не подходит, да и затыка у меня только с бритами...но все же думаю почитать про python уж много хвалебных отзывов о нем
37 Доктор Манхэттен
 
21.09.18
00:47
(34) Питон лучше чем ПХП, это верно тебе сказали. Жаваскрипт тоже лучше.
А сколько дохода тебе приносит твое дело? Я похожим занимаюсь, только в другом направлении.
38 Александр Тоха
 
21.09.18
00:53
(37) ну достаточно дохода.
39 Доктор Манхэттен
 
21.09.18
19:09
(38) Достаточно для чего? Как прибавка к основной работе? Или можно без напряга больше не работать, жить с родителями, и раз в год покупать себе оперативку для компа? Или достаточно чтобы путешествовать по Австралии на самолете?
Слишком неопределенное понятие.
40 Александр Тоха
 
23.09.18
16:17
(39) это и есть моя работа, отнимающая 10-12 часов в сутки. А доход достаточный для моих потребностей.
41 Доктор Манхэттен
 
23.09.18
16:19
(40) Понятненько. Но какие у тебя потребности примерно?
от 50 до 100 тысяч в месяц приносит доход? Или больше 100? Или меньше 50? Не стесняйся, тут все свои, каждый может поделиться своими доходами, налоговая ничего не узнает )))
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn