[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Записать массив в переменную
Yoda
Хотел, чтобы во внутреннем цикле происходила запись данных через запятую в переменную, но не могу этого сделать. Прошу помощи

$result = mysql_query("SELECT * FROM users ORDER BY surname");

while($myrow = mysql_fetch_assoc($result))
{
$id = $myrow['id'];
$name = $myrow['name'];
$second_name = $myrow['second_name'];
$surname = $myrow['surname'];

$res = mysql_query("SELECT value FROM bunch WHERE id_user = '$id' ");
while ($mr = mysql_fetch_assoc($res))
{
$music = $mr['value'] . ', ';
}

echo "<table><tr>";
echo "<td> <b>Имя:</b> " . $surname . " " . $name . " " . $id . "</td></tr>";
echo "<tr><td> <b>Музыка:</b> " . $music . "</td></tr>";

}


_____________
Идеальной защиты не существует...
AllesKlar
$music = $mr['value'] . ', ';
При каждой итерации цикла ты перезаписываешь значение переменной $music
Помимо прочего, она у тебя не инициилизирована.


$music = '';
while ($mr = mysql_fetch_assoc($res))
{
$music .= $mr['value'] . ', ';
// или так $music = $music . $mr['value'] . ', ';
}


И можно обойтись одним запросом.
SELECT users.*, bunch.value FROM users LEFT JOIN bunch 
ON users.id = bunch.id_user
ORDER BY users.surname
В твоем же примере ты отправляешь на сервер ( количество_юзеров + 1 ) запросов

_____________
[продано копирайтерам]
GET
Yoda

При этом у тебя $music будет заканчиваться на ', ', как будто там еще должно быть значение из-за последнего элемента в цикле.

Поэтому либо нужно будет его в конце, после цикла вырезать


$music = '';
while ($mr = mysql_fetch_assoc($res))
{
$music .= $mr['value'] . ', ';
// или так $music = $music . $mr['value'] . ', ';
}
$music=substr($music,0,-2);//или mb_substr если кодировка UTF-8


, либо сделать $music массивом, а потом implode вытянуть в строку
$music = array();
while ($mr = mysql_fetch_assoc($res))
{
$music[]= $mr['value'];
// или так $music = $music . $mr['value'] . ', ';
}
$music=implode(', ',$music);


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
McLotos
Цитата (ABC @ 26.11.2014 - 08:33)
$music = array();
while ($mr = mysql_fetch_assoc($res))
{
    $music[]= $mr['value'];
    // или так $music = $music . $mr['value'] . ', ';
}
$music=implode(', ',$music);

лучше не придумаешь. идеальное решение =)

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
kaww
Цитата (McLotos @ 26.11.2014 - 03:44)
лучше не придумаешь. идеальное решение

Решение от AllesKlar (без временного массива), только исправил, чтобы строка не заканчивалась запятой
if ($mr = mysql_fetch_assoc($res)) {

$music = $mr['value'];
while ($mr = mysql_fetch_assoc($res))
{
$music .= ', ' . $mr['value'];
}
}
AllesKlar
Цитата (McLotos @ 26.11.2014 - 07:44)
Цитата (ABC @ 26.11.2014 - 08:33)
$music = array();
while ($mr = mysql_fetch_assoc($res))
{
    $music[]= $mr['value'];
     // или так $music = $music . $mr['value'] . ', ';
}
$music=implode(', ',$music);

лучше не придумаешь. идеальное решение =)

И это пишет борец за ресурсы??? wink.gif
Не знаю, как в php, но в с++ (а php на нем и писан, следовательно, для php сие тоже должно быть справедливо), мы имеем адрес в памяти, где хранится эта переменная.
С массивом же, да еще неопределенного типа и размерности, получается просто непозволительная жратва памяти. В памяти выделяется место под переменную, в которую записывается физический адрес первого элемента массива, а уже оттуда для каждого последующего элемента отсчитываюмся байты, ХЗ какой размерностью, боюсь, что размерностью равной длине максимального элемента массива.
Плюс лишняя конструкция implode, которая фактически делает тоже самое, как если бы сразу писалось в переменную.
Эт я к чему.. а, да.. самолеты, JQuery, зубочистки wink.gif

_____________
[продано копирайтерам]
GET
kaww

Два одинаковых значения в строке будет, нет?


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
McLotos
Цитата (AllesKlar @ 26.11.2014 - 10:45)
Эт я к чему.. а, да.. самолеты, JQuery, зубочистки

biggrin.gif laugh.gif
Есть решение лучше?
implode, по-моему самый оптимальный вариант
А на счет размеров массива, то я никогда так не извращался, чтобы заранее задавать размерность, а на счет типов так тут вообще не стоит заморачиваться, пых сам разберется.

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
AllesKlar
ABC
Нет, не будет, т.к. mysql_fetch_assoc($res) читает очередную строку из результирующего набора и сдвигает указатель на следующую строку.

А вот, если запрос вернет пустой набор, то будет нотис, потому как
Цитата (AllesKlar @ 26.11.2014 - 06:19)
Помимо прочего, она (переменная) у тебя не инициилизирована.
ph34r.gif


_____________
[продано копирайтерам]
kaww
Цитата (AllesKlar @ 26.11.2014 - 04:53)
А вот, если запрос вернет пустой набор, то будет нотис,

вообще-то нет. Будет нотис если предполагается использование $music вне if() wink.gif
GET
Цитата
ABC
Нет, не будет, т.к. mysql_fetch_assoc($res) читает очередную строку из результирующего набора и сдвигает указатель на следующую строку.


Аха...smile.gif

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
inpost
McLotos
Абсолютно нет. Отказаться от устаревшего mysql и начать пользоваться mysqli, а там уже есть функция mysqli_fetch_all.

Yoda
Самое простое без переписывания всего кода - научиться пользоваться GROUP_CONCAT. Она уже на уровне mysql объединит через запятую без участия PHP.
http://webi.ru/webi_articles/8_14_f.html - почитай, всё с примерами. Как раз заменить внутренний запрос на твой.
Можешь попробовать ещё 1 общий, не уверен на 100%, что рабочий, так как не тестировал, но что-то вроде этого (может на форуме ещё подправят меня, если допустил ошибку):

SELECT a.*,GROUP_CONCAT(b.`value`) as `values`
FROM `users` a
LEFT JOIN table2 b ON b.`id_user` = a.`id`
GROUP BY a.`id`


Пища для ума, альтернативный вариант более сложный, но справляется лишь 1 запросом. Думаю, что он станет проще для тебя уловить логику подобных действий за пределами mysql (на будущее), так как через left join делается и всего 1 запрос:
Свернутый текст
LEFT JOIN в общем у тебя будет нечто вроде такого результат:
id (1),name,second_name, "первое value для данного id"
id (1),name,second_name, "второе value для данного id"
id (2),name,second_name, "первое value для данного id"

А дальше ещё проще:
перебор как ты делаешь через while, внутри цикла сделай дополнительное условие:
$res = mysql_query(... LEFT JOIN ...);
$firstid = 0;

while($myrow = mysql_fetch_assoc($res)) {
if($firstid == 0) {
$values = array($myrow['value']);
echo '<table><tr>...'; // весь вывод нового пользователя до строчки с value
} elseif($firstid != $myrow['id']) {
echo implode(',',$values);
$values = array();
echo '</td></tr></table><'; // весь вывод нового пользователя после строчки value ПРОШЛОГО и до строчки с value!
} else {
$values[] = $myrow['value'];
}
echo $myrow['value'];
$firstid = $myrow['id'];
}
if(count($values)) {
echo implode(',',$values);
$values = array();
echo '</td></tr></table><'; // весь вывод нового пользователя после строчки value ПРОШЛОГО и до строчки с value!
}


Писал на скорую руку, поэтому часть мог накосячить. Сам попробуй сделать нечто такое. Ничего сложного, обычные условия if-else с проверкой прошлого ID. 1 запрос и всё.

__________________________

Сделал максимально просто из того, что ТС мог сам догадаться, так как тут кроме LEFT JOIN в запросе (который уже выше подсказали) нет ничего сложного.


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.