Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Перекомпановка массива

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
KennyDead
Отправлено: 05 Марта, 2012 - 23:06:02
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Есть функция :

PHP:
скопировать код в буфер обмена
  1.  
  2. $data = mysql_query($request);
  3. while($extract = mysql_fetch_array($data, MYSQL_ASSOC))
  4. {
  5. $massive[] = $extract;
  6. }
  7. return $massive;
  8.  


Возвращает массив вида:

PHP:
скопировать код в буфер обмена
  1.  
  2. [0] => Array(
  3. [id] => 2,
  4. [name] => Alex
  5. ),
  6. [1] => Array(
  7. [id] => 4,
  8. [name] => Holy))
  9.  


Вопрос, как сделать из выше описанного массива вот такой массив:

PHP:
скопировать код в буфер обмена
  1.  
  2. [id] => Array(2, 4)
  3. [name] => Array(Alex, Holy)
  4. )
  5.  


Вообщем удалить численный массив, оставив ассоциативный..? Уже все перепробовал, не выходит, прошу помощи... Спасибо.
 
 Top
snikers987
Отправлено: 05 Марта, 2012 - 23:27:43
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. $data = mysql_query($request);
  3. while($extract = mysql_fetch_array($data, MYSQL_ASSOC)){
  4.         $massive['id'][] = $extract['id'];
  5.         $massive['name'][] = $extract['name'];
  6. }
  7. var_dump($massive);
  8.  

(Отредактировано автором: 05 Марта, 2012 - 23:28:15)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
KennyDead
Отправлено: 05 Марта, 2012 - 23:58:58
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




snikers987 пишет:
PHP:
скопировать код в буфер обмена
  1.  
  2. $data = mysql_query($request);
  3. while($extract = mysql_fetch_array($data, MYSQL_ASSOC)){
  4.         $massive['id'][] = $extract['id'];
  5.         $massive['name'][] = $extract['name'];
  6. }
  7. var_dump($massive);
  8.  


Не то... Ключи массива я привел как пример... Ключи не известны.
 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Марта, 2012 - 01:21:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




KennyDead вы еще уточните почему вам такая именно "компоновка" понадобилась, ато может она и не нужна, или есть более оптимальное решение..
PHP:
скопировать код в буфер обмена
  1. $rArr = array();
  2. for ($i = 0; $i < sizeof($sArr); $i++) {
  3.   foreach ($sArr[$i] as $k => $v) {
  4.     array_push($rArr[$k], $v);
  5.   }
  6. }
  7.  
  8. print_r($rArr);

Не проверял..
(Добавление)
Проверил, работает:
PHP:
скопировать код в буфер обмена
  1. $rArr = array();
  2. for ($i = 0; $i < sizeof($sArr); $i++) {
  3.   foreach ($sArr[$i] as $k => $v) {
  4.     if (isset($rArr[$k])) array_push($rArr[$k], $v);
  5.     else $rArr[$k] = array($v);
  6.   }
  7. }
  8.  
  9. echo '<pre>';
  10. print_r($rArr);
 
 Top
KennyDead
Отправлено: 06 Марта, 2012 - 07:18:11
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Я делаю функцию вывода данных из бд в виде ассоциативного массива. То есть функция должна возвращать готовый ассоциативный массив (с которым можно работать циклами foreach и for, а не только while), а не ресурсы.
 
 Top
snikers987
Отправлено: 06 Марта, 2012 - 08:21:34
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




А что Вам мешает переберать двумерный массив из первого поста?
PHP:
скопировать код в буфер обмена
  1.  
  2. foreach($rgArr as $rgChild){
  3.     foreach($rgChild as $sKey => $sValue){
  4.         echo $sKey.' => '.$sValue;
  5.     }
  6. }
  7.  


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
KennyDead
Отправлено: 06 Марта, 2012 - 08:52:27
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Все разобрался, спасибо большое)
 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Марта, 2012 - 08:54:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




KennyDead пишет:
массив с которым можно работать циклами foreach и for,
а не только while
Впервые слышу что массив можно перебирать only with while...
Его можно при желании перебрать и без фор, форич и пр.:
PHP:
скопировать код в буфер обмена
  1. $x = 0;
  2. $arr = array(0,8,6,5,7,8,6,4);
  3. function a() {
  4.   global $x, $arr;
  5.   echo $arr[$x];
  6.   if ($x < sizeof($arr)) {
  7.     $x++;
  8.     a();
  9.   }
  10. }
  11. a();

Но вернемся к вашей "проблеме".
Если имена и кол-во ключей не известны,
нужно сперва получить массив полностью в вашем "первичном" виде,
и только потом его перебрать тем (или похожим) способом который я показал.
Не вижу проблемы..
(Добавление)
snikers987, foreach плох тем что для перебора копируется оригинальный массив.
В моем примере для нескольких ассоциативных ключей,
во внутреннем цикле, в любой из итераций это не так страшно.
А если в основном массиве, который перебирает внешний цикл, будет > 1000 ключей?
Таки призываю юзать for! Закатив глазки

(Отредактировано автором: 06 Марта, 2012 - 08:56:26)

 
 Top
Мелкий Супермодератор
Отправлено: 06 Марта, 2012 - 10:54:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




DeepVarvar пишет:
foreach плох тем что для перебора копируется оригинальный массив.

Копируется, только если изменяется значение в цикле. Механизм аналогичен и для передачи параметров по значению в функции.
http://forum.php.su/topic.php?fo...9&topic=4084


-----
PostgreSQL DBA
 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Марта, 2012 - 11:09:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Мелкий пишет:
только если изменяется значение в цикле
Даже так - при использовании for, такого точно не будет.
Да, foreach есть обертка от for и ведет себя как ф-ция..
 
 Top
Мелкий Супермодератор
Отправлено: 06 Марта, 2012 - 11:35:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




DeepVarvar пишет:
Даже так - при использовании for, такого точно не будет.

Отчего же? Будет.
Если надо сделать какое-то действие с переменной - что foreach, что for, что while, хоть та же рекурсия - вам понадобится куда-то сохранить её.
Иначе - копирования происходить и не будет.

DeepVarvar пишет:
Да, foreach есть обертка от for и ведет себя как ф-ция..

Пруф, битте.
Меня вполне убедили в обратном: http://forum.php.su/topic.php?fo...40596#1282240596


-----
PostgreSQL DBA
 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Марта, 2012 - 17:45:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Цитата:
если бы в PHP существовали реальные целочисленные массивы то доступ к ним был бы конечно более быстрым использовации цикла for - однако в PHP представлены именно ассоциативные массивы для которых даже числовой индекс является ключом По этой причине обращение к некоторому элементу массива влечет за собой поиск указанного ключа во внутреннем списке - а при использовании цикла for генерируется много элементов для поиска на основе образующей строки
В то же время цикл foreach использует реальный внутренний индекс массива - который является именно числовым и обозначает все содержащиеся в нем элементы в некоторой последовательности - причем без пропусков в нумерации Именно такой способ доступа реализует наиболее прямое обращение к элемента - а следовательно и является самым быстрым

Убедительно! Намотал на ус. Специфика интерпретируемого ЯП...
 
 Top
KennyDead
Отправлено: 07 Марта, 2012 - 07:40:52
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Читая мануалы по MySQL, я обратил внимание что при выводе ответа от функции mysql_query() всегда используется цикл while, я попробовал вывести циклом foreach, но на выходе ничего не оказалось, массив был пуст, но это можно обойти если использовать foreach вот так foreach($resource as $key=>$value) и все прекрасно выводиться... Я пишу класс для работы с бд MySQL что то напоминающего по типу PDO, и использую некоторые функции по экранированию, но это на малость но замедляет работу, а хочется сделать его максимально быстрым, вот и возмещаю скорость как можно меньшим количеством операций... Если надо могу выложить класс, он по весу мал, но работает вроде пока без сбоев.. Может что то подскажете, что я сделал не так... За критику был бы благодарен...
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB