PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Описание: Мозговой штурм - многомерные массивы
Поиск в теме | Версия для печати
Prizma
Отправлено: 16 Сентября, 2018 - 16:50:22
Посетитель
Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012
Откуда: Санкт-Петербург
Помог: 5 раз(а)
Добрый день,
в ходе работы потребовалось решить интересную задачку, решил поделится с аудиторией моего любимого форума.
Сразу к делу:
PHP:
скопировать код в буфер обмена
<?PHP
class CpcData
{
// [source][type][campaign][ads][keyword][position] => amount
private $referrers = [
'google' => [ // source
'cpc' => [ // type
'context' => [ // campaign
123456789 => [ // ads
'ключевое слово' => [ // keyword
2 => 10 // position => amount
]
] ,
123456790 => [
'другое ключевое слово' => [
1 => 5
]
]
] ,
'retarget' => [
123456791 => [
'ключевое слово' => [
0 => 11
]
] ,
123456792 => [
'другое ключевое слово' => [
0 => 32
]
]
]
]
] ,
'yandex' => [ // source
'cpc' => [ // type
'context' => [ // campaign
223456789 => [ // ads
'ключевое слово' => [ // keyword
2 => 10 // position => amount
]
] ,
223456790 => [
'другое ключевое слово' => [
1 => 5
]
]
] ,
'retarget' => [
223456791 => [
'ключевое слово' => [
0 => 3
]
] ,
223456792 => [
'другое ключевое слово' => [
0 => 22
]
]
]
]
]
] ;
/**
* Если все параметры === null:
* return $this->referrers;
* Eсли все параметры !== null:
* return isset($this->referrers[$p1][$p2][$p3][$p4][$p5][$p6]) ? $this->referrers[$p1][$p2][$p3][$p4][$p5][$p6] : 0;
* Иначе фильтрует массив по параметрам !== null уменьшая его многомерность по известным звеньям:
* // частный пример №1
* $p1 = 'x'; $p2 = 'y'; // $p1 - source, $p2 - type
* return isset($this->referrers[$p1][$p2]) ? $this->referrers[$p1][$p2] : [];
* // частный пример №2
* $type = 'x'; // p2
* $rf = $this->referrers;
* foreach($rf as $source => $types) {
* if(isset($types[$type])) {
* $rf[$source] = $types[$type];
* }else{
* unset($rf[$source]);
* }
* }
* return $rf;
*/
public function getReferrers( $source = null , $type = null , $campaign = null , $ads = null , $keyword = null , $position = null )
{
if ( $source !== null && $type !== null && $campaign !== null && $ads !== null && $keyword !== null && $position !== null ) {
$rf = $this -> referrers ;
return isset ( $rf [ $source ] [ $type ] [ $campaign ] [ $ads ] [ $keyword ] [ $position ] ) ?
$rf [ $source ] [ $type ] [ $campaign ] [ $ads ] [ $keyword ] [ $position ] : 0 ;
} elseif ( $source !== null || $type !== null || $campaign !== null || $ads !== null || $keyword !== null || $position !== null ) {
/**
* обработка всех остальных случаев
*/
} else {
return $this -> referrers ;
}
}
}
?>
PS: данные грузятся не из бд, а из локальных файлов, массив достаточно объемный, для вывода, обрабатывается 20-30 файлов в каждом из которых такой массив забитый данными посещений за неделю, из данных генерируются графики отражающие те или иные показатели
PPS: думаю сегодня завтра выложу своё решение, не знаю будет ли оно достаточно производительным для поставленных задач.
Prizma
Отправлено: 16 Сентября, 2018 - 19:09:51
Посетитель
Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012
Откуда: Санкт-Петербург
Помог: 5 раз(а)
Мелкий пишет: А где сама задача-то?
Там где приведено 2 частных примера, нужно написать участок кода, который бы работал для всех пяти аргументов, независимо сколько и какие из них == null. Примеры приведены исключительно для конкретизации результата.
(Добавление)
Решение оказалось достаточно простым, производительность вроде должна быть норм - посмотрим:
Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
public function getReferrers( $source = null , $type = null , $campaign = null , $ads = null , $keyword = null , $position = null )
{
if ( $source !== null && $type !== null && $campaign !== null && $ads !== null && $keyword !== null && $position !== null ) {
$rf = $this -> referrers ;
return isset ( $rf [ $source ] [ $type ] [ $campaign ] [ $ads ] [ $keyword ] [ $position ] ) ?
$rf [ $source ] [ $type ] [ $campaign ] [ $ads ] [ $keyword ] [ $position ] : 0 ;
} elseif ( $source !== null || $type !== null || $campaign !== null || $ads !== null || $keyword !== null || $position !== null ) {
$keys = [ $source , $type , $campaign , $ads , $keyword , $position ] ;
$refs = $this -> referrers ;
$this -> arrayParser ( $refs , $keys ) ; // поехали
return $refs ; // готово
} else {
return $this -> referrers ;
}
}
private function arrayParser
( array & $ar , array $keys ) {
$i = 0 ; // index of $key
foreach ( $keys as $key ) {
$i ++;
if ( $key === null ) {
// проверяем остались ли еще ключи
// Передаём каждый элемент на проверку по оставшимся ключам
foreach ( $ar as $k => & $v ) {
if ( $v === [ ] ) {
}
}
}
// Прекращаем обработку ключей, оставшиеся ключи обработает рекурсия
break ;
} else {
// убираем лишний уровень вложенности
$ar = $ar [ $key ] ;
} else {
$ar = [ ] ;
// Не найдено соответствий, прекращаем последующий поиск
break ;
}
}
}
}
Полный код:
PHP:
скопировать код в буфер обмена
<?PHP
class CpcData
{
// [source][type][campaign][ads][keyword][position] => amount
private $referrers = [
'google' => [ // source
'cpc' => [ // type
'context' => [ // campaign
123456789 => [ // ads
'ключевое слово' => [ // keyword
2 => 10 // position => amount
]
] ,
123456790 => [
'другое ключевое слово' => [
1 => 5
]
]
] ,
'retarget' => [
123456791 => [
'ключевое слово' => [
0 => 11
]
] ,
123456792 => [
'другое ключевое слово' => [
0 => 32
]
]
]
]
] ,
'yandex' => [ // source
'cpc' => [ // type
'context' => [ // campaign
223456789 => [ // ads
'ключевое слово' => [ // keyword
2 => 10 // position => amount
]
] ,
223456790 => [
'другое ключевое слово' => [
1 => 5
]
]
] ,
'retarget' => [
223456791 => [
'ключевое слово' => [
0 => 3
]
] ,
223456792 => [
'другое ключевое слово' => [
0 => 22
]
]
]
]
]
] ;
/**
* Если все параметры === null:
* return $this->referrers;
* Eсли все параметры !== null:
* return isset($this->referrers[$p1][$p2][$p3][$p4][$p5][$p6]) ? $this->referrers[$p1][$p2][$p3][$p4][$p5][$p6] : 0;
* Иначе фильтрует массив по параметрам !== null уменьшая его многомерность по известным звеньям:
* // частный пример №1
* $p1 = 'x'; $p2 = 'y'; // $p1 - source, $p2 - type
* return isset($this->referrers[$p1][$p2]) ? $this->referrers[$p1][$p2] : [];
* // частный пример №2
* $type = 'x'; // p2
* $rf = $this->referrers;
* foreach($rf as $source => $types) {
* if(isset($types[$type])) {
* $rf[$source] = $types[$type];
* }else{
* unset($rf[$source]);
* }
* }
* return $rf;
*/
public function getReferrers( $source = null , $type = null , $campaign = null , $ads = null , $keyword = null , $position = null )
{
if ( $source !== null && $type !== null && $campaign !== null && $ads !== null && $keyword !== null && $position !== null ) {
$rf = $this -> referrers ;
return isset ( $rf [ $source ] [ $type ] [ $campaign ] [ $ads ] [ $keyword ] [ $position ] ) ?
$rf [ $source ] [ $type ] [ $campaign ] [ $ads ] [ $keyword ] [ $position ] : 0 ;
} elseif ( $source !== null || $type !== null || $campaign !== null || $ads !== null || $keyword !== null || $position !== null ) {
$keys = [ $source , $type , $campaign , $ads , $keyword , $position ] ;
$refs = $this -> referrers ;
$this -> arrayParser ( $refs , $keys ) ;
return $refs ;
} else {
return $this -> referrers ;
}
}
private function arrayParser
( array & $ar , array $keys ) {
$i = 0 ; // index of $key
foreach ( $keys as $key ) {
$i ++;
if ( $key === null ) {
// проверяем остались ли еще ключи
// Передаём каждый элемент на проверку по оставшимся ключам
foreach ( $ar as $k => & $v ) {
if ( $v === [ ] ) {
}
}
}
// Прекращаем обработку ключей, оставшиеся ключи обработает рекурсия
break ;
} else {
// убираем лишний уровень вложенности
$ar = $ar [ $key ] ;
} else {
$ar = [ ] ;
// Не найдено соответствий, прекращаем последующий поиск
break ;
}
}
}
}
}
?>
Проверка: PHP:
скопировать код в буфер обмена
$a = new CpcData( ) ;
$rf = $a -> getReferrers ( 'yandex' , 'cpc' , 'context' , 223456789 , 'ключевое слово' , 2) ;
$rf = $a -> getReferrers ( null , 'cpc' , 'context' , 223456789 , 'ключевое слово' , 2) ;
var_dump ( $rf ) ; // array (size=1) 'yandex' => int 10 $rf = $a -> getReferrers ( 'yandex' , null , null , 223456789 , 'ключевое слово' , 2) ;
/*
array (size=1)
'cpc' =>
array (size=1)
'context' => int 10
*/
$rf = $a -> getReferrers ( 'yandex' , null , null , null , 'ключевое слово' , 2) ;
/*
array (size=1)
'cpc' =>
array (size=1)
'context' =>
array (size=1)
223456789 => int 10
*/
$rf = $a -> getReferrers ( null , 'cpc' , 'retarget' , null , null , 0) ;
/*
array (size=2)
'google' =>
array (size=2)
123456791 =>
array (size=1)
'ключевое слово' => int 11
123456792 =>
array (size=1)
'другое ключевое слово' => int 32
'yandex' =>
array (size=2)
223456791 =>
array (size=1)
'ключевое слово' => int 3
223456792 =>
array (size=1)
'другое ключевое слово' => int 22
*/
(Отредактировано автором: 16 Сентября, 2018 - 20:03:50)
Поиск в теме | Версия для печати
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB