Я работаю над проектом»в Zend Framework, и я пытаюсь объединить t'he результат моих запросов SQL в одном массиве, как $result
здесь мои запросы:Объединить массивы рекурсивно PHP
public function getOpen()
{
$query = $this->select()
->setIntegrityCheck(false)
->from(array('e' => 'emails'), array(
'isp' => new Zend_Db_Expr("SUBSTRING_INDEX(e.email_value, '@', -1)"),
'count' => new Zend_Db_Expr('COUNT(*)')))
->join(array('to' => 'track_open'), 'e.email_id = to.email_id', array(''))
->where('e.email_id = to.email_id')
//->where('DATE(open_date) = ? ', $date)
->group(new Zend_Db_Expr("SUBSTRING_INDEX(e.email_value, '@', -1)"));
$result = $this->fetchAll($query);
if($result)
{
return $result->toArray();
}
return false;
}
public function getUnsubscribe()
{
$query = $this->select()
->setIntegrityCheck(false)
->from(array('e' => 'emails'), array(
'isp' => new Zend_Db_Expr("SUBSTRING_INDEX(e.email_value, '@', -1)"),
'count' => new Zend_Db_Expr('COUNT(*)')))
->join(array('tu' => 'track_unsubscribe'), 'e.email_id = tu.email_id', array(''))
->where('e.email_id = tu.email_id')
//->where('DATE(unsubscribe_date) = ? ', $date)
->group(new Zend_Db_Expr("SUBSTRING_INDEX(e.email_value, '@', -1)"));
$result = $this->fetchAll($query);
if($result)
{
return $result->toArray();
}
return false;
}
public function getClick()
{
$query = $this->select()
->setIntegrityCheck(false)
->from(array('e' => 'emails'), array(
'isp' => new Zend_Db_Expr("SUBSTRING_INDEX(e.email_value, '@', -1)"),
'count' => new Zend_Db_Expr('COUNT(*)'),
'tc.click_date',))
->join(array('tc' => 'track_click'), 'e.email_id = tc.email_id', array(''))
->where('e.email_id = tc.email_id')
//->where('DATE(click_date)= ? ', $date)
->group(new Zend_Db_Expr("SUBSTRING_INDEX(e.email_value, '@', -1)"));
$result = $this->fetchAll($query);
if($result)
{
return $result->toArray();
}
return false;
}
public function getlogs()
{
$query = $this->select()
->setIntegrityCheck(false)
->from(array('ee' => 'email_errors'),
array( 'isp' => new Zend_Db_Expr('ee.FAI'),
'sent' => new Zend_Db_Expr("SUM(ee.STATUS =0)"),
'deferred' => new Zend_Db_Expr("SUM(ee.STATUS =1)"),
'bounced' => new Zend_Db_Expr("SUM(ee.STATUS =2)")))
->group(new Zend_Db_Expr("FAI"));
$result = $this->fetchAll($query);
if($result)
{
return $result->toArray();
}
return false;
}
public function getSB()
{
$query = $this->select()
->setIntegrityCheck(false)
->from(array('e' => 'emails'), array(
'isp' => new Zend_Db_Expr("SUBSTRING_INDEX(e.email_value, '@', -1)"),
'count' => new Zend_Db_Expr('COUNT(*)')))
->join(array('tb' => 'track_bounce'), 'e.email_id = tb.email_id', array(''))
->where('e.email_id = tb.email_id')
//->where('DATE(bounce_date) = ? ', $date)
->where('tb.bounce_type = ?', "soft")
->group(new Zend_Db_Expr("SUBSTRING_INDEX(e.email_value, '@', -1)"));
$result = $this->fetchAll($query);
if($result)
{
return $result->toArray();
}
return false;
}
public function getHB()
{
$query = $this->select()
->setIntegrityCheck(false)
->from(array('e' => 'emails'), array(
'isp' => new Zend_Db_Expr("SUBSTRING_INDEX(e.email_value, '@', -1)"),
'count' => new Zend_Db_Expr('COUNT(*)')))
->join(array('tb' => 'track_bounce'), 'e.email_id = tb.email_id')
->where('e.email_id = tb.email_id')
//->where('DATE(bounce_date) = ? ', $date)
->where('tb.bounce_type = ?', "hard")
->group(new Zend_Db_Expr("SUBSTRING_INDEX(e.email_value, '@', -1)"));
$result = $this->fetchAll($query);
if($result)
{
return $result->toArray();
}
return false;
}
и t'his t'he функции, что я сделал, чтобы сделать t'he слияния:
function array_merge_rec($arrays)
{
$result = array();
$keys = array('logs','open', 'click', 'unsubscribe', 'soft', 'hard',);
foreach ($arrays as $key => $value) {
if (is_array($value)) {
foreach ($value as $item) {
$result[$item['isp']][$key] = $item['count'];
}
}
}
$results = array();
foreach($result as $key => $value)
{
foreach($keys as $k)
{
if(!isset($result[$key][$k])) $result[$key][$k] = 0;
}
}
return $result;
}
и если нужно это мое действие контроллер:
public function logsAction()
{
$log_review = new Dashboard_Model_DbTable_logs();
$open = $log_review->getOpen();
$click = $log_review->getClick();
$unsubscribe = $log_review->getUnsubscribe();
$logs = $log_review->getlogs();
$SB = $log_review->getSB();
$HB = $log_review->getHB();
$result = $this->array_merge_rec(array('logs'=>$logs,'open' => $open, 'click' => $click, 'unsubscribe' => $unsubscribe, 'hard' => $HB, 'soft' => $SB));
$this->view->data = $result;
}
Как я уже сказал, я пытаюсь объединить все результаты запросов в один массив «результат» на основе ISP. И когда я объединяю все запросы без запроса getlogs, функция работает нормально, но когда я добавляю запрос getlogs к параметру функции, это не работает, и это нормально. Так что мне нужна помощь, чтобы знать, как я могу изменить функцию слияния, чтобы получить массив, который содержит все колонки объединены в общую колонку ISP для всех запросов
Спасибо! ваша функция is_assoc - это классическая функция для проверки того, является ли массив ассоциативным? – Ahmadhc
Добавлены другие необходимые методы, в любом случае проверьте класс kohana arr. – rernesto