Имя: Пароль:
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? Не стесняйся, тут все свои, каждый может поделиться своими доходами, налоговая ничего не узнает )))