Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> собрать правильный массив из данных
Por$h  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 203
Пользователь №: 23341
На форуме: 6 лет, 4 месяца, 7 дней
Карма:




Храню данные в 2-х таблицах.
loans и installments
пример:
loan_id = в обеих таблицах
amount и status в таблие loans
date, principal, interest в installments
мне надо вытащить все записи в вот такую структуру, т.е 1 или несколько записей из таблицы installments относятся к одной записи из таблицы loans.

Подскажите как , голова не варит совсем !?
Здесь 2 записи в таблице loan, и 3 записи в таблице instalments.
[
{
"loan_id": "foo",
"amount": 150,
"status": "issued",
"instalments": [{
"date": "2016-07-15",
"principal": 50.12,
"interest": 0.08
}, {
"date": "2016-07-16",
"principal": 30,
"interest": 0.08
}]
},

{
"loan_id": "bar",
"amount": 150,
"status": "issued",
"instalments": [{
"date": "2016-07-15",
"principal": 50.12,
"interest": 0.08
}]
}
]


запрос из бд у меня обычный inner join, что в итоге получаю:

$array = array (

array (
'loan_id' => 'foo',
'amount' => 120.00,
'status' => 'requested',
'principal' => 70.00,
'interest' => 0.80,
'date' => '2016-07-15'
),

array (
'loan_id' => 'bar',
'amount' => 150.00,
'status' => 'requested',
'principal' => 30.00,
'interest' => 0.80,
'date' => '2016-07-16'
),

array (
'loan_id' => 'foo',
'amount' => 150.00,
'status' => 'requested',
'principal' => 60.00,
'interest' => 0.80,
'date' => '2016-07-17'
),

array (
'loan_id' => 'baz',
'amount' => 150.00,
'status' => 'requested',
'principal' => 25.00,
'interest' => 0.80,
'date' => '2016-07-18'
),

array (
'loan_id' => 'bar',
'amount' => 150.00,
'status' => 'requested',
'principal' => 20.00,
'interest' => 0.80,
'date' => '2016-07-19'
),

array (
'loan_id' => 'hez',
'amount' => 135.00,
'status' => 'requested',
'principal' => 20.00,
'interest' => 0.80,
'date' => '2016-07-20'
),

array (
'loan_id' => 'bar',
'amount' => 150.00,
'status' => 'requested',
'principal' => 30.00,
'interest' => 0.80,
'date' => '2016-07-17'
),
);




function getLoans($dataArray) {

$allLoans = [];
foreach ($dataArray as $key => $val) {
$currentLoan = [];
$currentLoan['amount'] = $val['amount'];
$currentLoan['status'] = $val['status'];
$currentLoan['loan_id'] = $val['loan_id'];


// find keys for this loan_id
$thisLoanKeys = getLoanKeys($dataArray, $val['loan_id']);

// dostat date,principal,interest u vsex massivov po zadannqm klju4am
$thisLoanInstalments = getThisLoanInstalments($dataArray, $thisLoanKeys);

$currentLoan['instalments'] = $thisLoanInstalments;

// sohranaem etot loan v $allLoans
$allLoans[] = $currentLoan;


// udalit massivq po etim klju4am


// pereindeksirovat

// vqzvat etu ze funkciju libo proverjat loan_id est li on uze v massive $allLoans


}

return $allLoans;
}

function getLoanKeys($array, $loanId){
$keys = [];
for($i=0; $i< count($array); $i++) {
if(array_keys($array[$i], $loanId)) {
$keys[] = $i;
}
}

return [$loanId => $keys];
}


$allLoanIds = getLoanKeys($array, 'foo');


function getThisLoanInstalments($array, $allLoanIds) {
foreach($allLoanIds as $k => $v)
{
$thisInstalment = [];
foreach($v as $kkv){
$loanInstalments['principal'] = $array[$kkv]['principal'];
$loanInstalments['interest'] = $array[$kkv]['interest'];
$loanInstalments['date'] = $array[$kkv]['date'];

$thisInstalment[] = $loanInstalments;
}
}

return $thisInstalment;
}



print_r(getLoans($array));
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1357
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 12 дней
Карма: 77




2 запроса
//запрос таблицы loans
$array[ $val['loan_id'] ] = $val;

//запрос таблицы installments
$array[ $val['loan_id'] ]['instalments'][] = $val;

echo '<pre>';
print_r( json_encode($array) );
echo '</pre>';

1 запрос
SELECT 
i.*, l.*
FROM
`installments` AS i
LEFT JOIN
`loans` AS l ON l.loan_id = i.loan_id

if (!isset($array[ $val['loan_id'] ])) {
$array[ $val['loan_id'] ] = [
'loan_id' => $val['loan_id'],
'amount' => $val['amount'],
'status'=> $val['status'],
'instalments' => [
[] => [

'date' => $val['date'],
'principal' => $val['principal'],
'interest' => $val['interest'],
],
],
];

} else {
$array[ $val['loan_id'] ]['instalments'][] = [
'date' => $val['date'],
'principal' => $val['principal'],
'interest' => $val['interest'],
];

}


Это сообщение отредактировал Kusss - 7.07.2016 - 01:16
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Por$h  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 203
Пользователь №: 23341
На форуме: 6 лет, 4 месяца, 7 дней
Карма:




я наверно неправильно объяснил. Отредактировал изначальный пост
Мне надо вытащить все Loan записи. А в одном loan может быть как минимум 1 instalment {date,principal,interest}.
Добавил кусок кода getLoans() ...его надо доделать...комментами добавил как это вижу я, только не уверен как это сделать.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1357
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 12 дней
Карма: 77




вы пробовали хоть что я написал ?
Если я равильно понял, в результате нужно получить json массив как в 1 вставке ?
Если это так, скиньте дамп базы с частью данных.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Por$h  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 203
Пользователь №: 23341
На форуме: 6 лет, 4 месяца, 7 дней
Карма:




Kusss
мне не понятна ваша первая вставка. что должно быть на месте $val
$val = результат запроса select * from loans ?
$array[ $val['loan_id'] ] = $val;


3 запроса в итоге или все же один джойн ?
Да, нужно получить в итоге json как в первой вставке..
вот дамп, все данные тоже тестовые.
# Dump of table loan_instalment
# ------------------------------------------------------------


CREATE TABLE `loan_instalment` (
`loan_instalment_id` int(11) NOT NULL AUTO_INCREMENT,
`loan_id` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`principal` decimal(10,2) NOT NULL,
`interest` decimal(10,2) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`loan_instalment_id`),
UNIQUE KEY `loan_instalment_id` (`loan_instalment_id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

LOCK TABLES `loan_instalment` WRITE;
/*!40000 ALTER TABLE `loan_instalment` DISABLE KEYS */;

INSERT INTO `loan_instalment` (`loan_instalment_id`, `loan_id`, `principal`, `interest`, `date`)
VALUES
(1,'loan577d28d2f2ceb',50.50,0.80,'2016-07-06'),
(
2,'loan577d2d8e7719d',50.50,0.80,'2016-05-13'),
(
3,'loan577d2e22bf1f0',50.50,0.80,'2016-05-13'),
(
4,'loan577d2e22bf1f0',13.50,0.80,'2016-06-14'),
(
5,'loan577d325201fe1',50.50,0.80,'2016-05-13'),
(
6,'loan577d325201fe1',13.50,0.80,'2016-06-14'),
(
7,'loan577e268e5a560',50.50,0.80,'2016-05-13'),
(
8,'loan577e268e5a560',13.50,0.80,'2016-06-14');

/*!40000 ALTER TABLE `loan_instalment` ENABLE KEYS */;
UNLOCK TABLES;


# Dump of table loans
# ------------------------------------------------------------


CREATE TABLE `loans` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`loan_id` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`client_id` int(11) NOT NULL,
`status` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`amount` decimal(10,4) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

LOCK TABLES `loans` WRITE;
/*!40000 ALTER TABLE `loans` DISABLE KEYS */;

INSERT INTO `loans` (`id`, `loan_id`, `client_id`, `status`, `amount`)
VALUES
(1,'loan577d28d2f2ceb',0,'requested',150.0000),
(
2,'loan577d2d8e7719d',0,'requested',150.0000),
(
3,'loan577d2e22bf1f0',0,'requested',150.0000),
(
4,'loan577d325201fe1',0,'requested',150.0000),
(
5,'loan577e268e5a560',0,'requested',150.0000);
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Por$h  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 203
Пользователь №: 23341
На форуме: 6 лет, 4 месяца, 7 дней
Карма:




ниже рабочий код, но он мне не нравится, если кто сможет, пожалуйста напишите сюда.
// выборка из бд такая:
$array = array (

array (
'loan_id' => 'foo',
'amount' => 120.00,
'status' => 'requested',
'principal' => 70.00,
'interest' => 0.80,
'date' => '2016-07-15'
),

array (
'loan_id' => 'bar',
'amount' => 150.00,
'status' => 'requested',
'principal' => 30.00,
'interest' => 0.80,
'date' => '2016-07-16'
),

array (
'loan_id' => 'foo',
'amount' => 150.00,
'status' => 'requested',
'principal' => 60.00,
'interest' => 0.80,
'date' => '2016-07-17'
),

array (
'loan_id' => 'baz',
'amount' => 150.00,
'status' => 'requested',
'principal' => 25.00,
'interest' => 0.80,
'date' => '2016-07-18'
),

array (
'loan_id' => 'bar',
'amount' => 150.00,
'status' => 'requested',
'principal' => 20.00,
'interest' => 0.80,
'date' => '2016-07-19'
),
array (
'loan_id' => 'baz',
'amount' => 140.00,
'status' => 'requested',
'principal' => 25.00,
'interest' => 0.80,
'date' => '2016-07-26'
),
array (
'loan_id' => 'hez',
'amount' => 135.00,
'status' => 'requested',
'principal' => 20.00,
'interest' => 0.80,
'date' => '2016-07-20'
),

array (
'loan_id' => 'bar',
'amount' => 150.00,
'status' => 'requested',
'principal' => 30.00,
'interest' => 0.80,
'date' => '2016-07-17'
),
);




function getLoans($dataArray) {

$allLoans = [];
foreach ($dataArray as $key => $val) {

$kk = array_search($val['loan_id'], array_column($allLoans, 'loan_id'));
if($kk !== false) {
continue;
}

$currentLoan = [];
$currentLoan['amount'] = $val['amount'];
$currentLoan['status'] = $val['status'];
$currentLoan['loan_id'] = $val['loan_id'];

// find keys for this loan_id
$thisLoanKeys = getLoanKeys($dataArray, $val['loan_id']);

// get all instalments data for This Loan
$thisLoanInstalments = getThisLoanInstalments($dataArray, $thisLoanKeys);
$currentLoan['instalments'] = $thisLoanInstalments;

$allLoans[] = $currentLoan;
}

return $allLoans;
}

function getLoanKeys($array, $loanId){
$keys = [];
for($i=0; $i< count($array); $i++) {
if(array_keys($array[$i], $loanId)) {
$keys[] = $i;
}
}

return [$loanId => $keys];
}


function getThisLoanInstalments($array, $allLoanIds) {
foreach($allLoanIds as $k => $v)
{
$thisInstalment = [];
foreach($v as $kkv){
$loanInstalments['principal'] = $array[$kkv]['principal'];
$loanInstalments['interest'] = $array[$kkv]['interest'];
$loanInstalments['date'] = $array[$kkv]['date'];

$thisInstalment[] = $loanInstalments;
}
}

return $thisInstalment;
}


print_r(getLoans($array));
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1357
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 12 дней
Карма: 77




$array = [];

$sql = "
SELECT
i.*, l.*
FROM
`loan_instalment` AS i
LEFT JOIN
`loans` AS l ON l.loan_id = i.loan_id
"
;
$sql = mysql_query($sql) or die( mysql_error() );
if (mysql_num_rows($sql) > 0) {
while ($val = mysql_fetch_assoc($sql)){
if (!isset($array[ $val['loan_id'] ])) {
$array[ $val['loan_id'] ] = [
'loan_id' => $val['loan_id'],
'amount' => $val['amount'],
'status'=> $val['status'],
'instalments' => [
0 => [
'date' => $val['date'],
'principal' => $val['principal'],
'interest' => $val['interest'],
],
],
];

} else {
$array[ $val['loan_id'] ]['instalments'][] = [
'date' => $val['date'],
'principal' => $val['principal'],
'interest' => $val['interest'],
];

}
}
}


sort($array);

$json = json_encode($array, JSON_PRETTY_PRINT);
echo '<pre>';
echo $json;


Это сообщение отредактировал Kusss - 7.07.2016 - 17:40
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса