Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Разобрать и собрать массив
 
 автор: tima2010   (19.09.2011 в 16:58)   письмо автору
 
 

приветствую!

как можно сначала разобрать массив а потом его собрать обратно?
есть код:

Изначальный вид Ассоциативного массива:


Array
(
    [myarray] => Array
        (
            [5] => Текст пятый
            [6] => Текст шестой
        )

    [mybutton] => Submit
)


Теперь нужно к элементам этого массива добавить к примеру текст из переменной чтобы в начале каждого стояло значение переменной
причем переменная динамическая и берется из БД


<?php

$query 
"SELECT * FROM mytable";
$res mysql_query($query) or die(mysql_error());

foreach(
$_POST['myarray'] as $key=> $value)
{
while (
$row mysql_fetch_array($res)) {
$valuearr$row['myaddtext'].$value;
$valuearrfull .= array($key=>$valuearr);
}
}

echo 
"<pre>";
print_r($valuearrfull);
echo 
"<pre>";

?>

как лучше это сделать? при моем варианте получаю просто ArrayArray

  Ответить  
 
 автор: Lotanaen   (19.09.2011 в 17:18)   письмо автору
 
   для: tima2010   (19.09.2011 в 16:58)
 

попробуйте так:

<?php

$query 
"SELECT * FROM mytable";
$res mysql_query($query) or die(mysql_error());

foreach(
$_POST['myarray'] as $key=> $value)
{
while (
$row mysql_fetch_array($res)) {
$valuearr$row['myaddtext'].$value;
$valuearrfull[$key][]=$valuearr;
}
}

echo 
"<pre>";
print_r($valuearrfull);
echo 
"<pre>";

?> 


в результате вы получите двумерный массив. Не совсем понятно что вы хотите получить в итоге...

  Ответить  
 
 автор: tima2010   (19.09.2011 в 17:35)   письмо автору
 
   для: Lotanaen   (19.09.2011 в 17:18)
 

Все понял спасибо!

как всегда это просто кусок кода из много строчного текста
чтобы показать что хочу в итоге придется размещать много строк которые будут только мешать пониманию простой задачи

еще раз Спасибо!

  Ответить  
 
 автор: tima2010   (19.09.2011 в 18:31)   письмо автору
 
   для: Lotanaen   (19.09.2011 в 17:18)
 

извините но, что-то не то получается

принял ваше решение
в итоге получился такое код


<?php 

$query 
"SELECT * FROM mytable"
$res mysql_query($query) or die(mysql_error()); 

foreach(
$_POST['myarray'] as $key=> $value

while (
$row mysql_fetch_array($res)) { 
$valuearr$row['myaddtext'].$value
$valuearrfull[$key]=$valuearr



echo 
"<pre>"
print_r($valuearrfull); 
echo 
"<pre>"

?>  


но данные foreach а именно переменные $key $value принимает только первое значение... получается вид такой:

Array 

    [myarray] => Array 
        ( 
            [5] => Добавили текст 1 Текст пятый 
            [5] => Добавили текст 2 Текст пятый 
        ) 

    [mybutton] => Submit 

  Ответить  
 
 автор: Lotanaen   (20.09.2011 в 09:12)   письмо автору
 
   для: tima2010   (19.09.2011 в 18:31)
 

а что вам в итоге нужно получить? массив исходный должен остаться без добавления новых значений, а только изменение старых? Или каждому значению добавить новый массив? если первое, то по какому принципу из БД добавлять текст? (если второе, то как раз мой вариант подходит).

  Ответить  
 
 автор: tima2010   (20.09.2011 в 11:00)   письмо автору
 
   для: Lotanaen   (20.09.2011 в 09:12)
 

у меня при таком коде

почему то $value принимает только свое первое значение в цикле
тоесть с вашим методом получаю

Array  
(  
    [myarray] => Array  
        (  
            [5] => Добавили текст 1 ТЕКСТ ПЯТЫЙ
            [5] => Добавили текст 2 ТЕКСТ ПЯТЫЙ  
        )  

    [mybutton] => Submit  


а нужно получить


Array  
(  
    [myarray] => Array  
        (  
            [5] => Добавили текст 1 Текст ПЯТЫЙ
            [6] => Добавили текст 2 Текст ШЕСТОЙ
        )  

    [mybutton] => Submit  



на данный момент код который выводит не верный вариант выглядит так:


<?php
$query 
"SELECT * FROM mytable ORDER BY `myid`";
$res mysql_query($query) or die(mysql_error());

foreach(
$_POST['myarray'] as $key=> $value) { // раскрываем массив
    
while ($row mysql_fetch_array($res)) { // получаем текст из базы который нам нужен
    
        
$valuearr$row['myaddtext'].$value// к содержимому тексту массива добавляем из базы текст
        
$valuearrfull[$key] = $valuearr;  // формируем обратно массив
        
    
}
}

echo 
"<pre>";  
print_r($valuearrfull);  
echo 
"<pre>"


/*
Array  
(  
    [myarray] => Array  
        (  
            [5] => Добавили текст 1 ТЕКСТ ПЯТЫЙ // верно
            [5] => Добавили текст 2 ТЕКСТ ПЯТЫЙ // НЕ ВЕРНО должен быть шестой
        )  

    [mybutton] => Submit  
)
*/
?>


p.s. Массив отсортирован таким образом что добавляемые данные из базы совпадают по верному порядку, т.к. вывод данных из базы сортируем по myid

  Ответить  
 
 автор: Lotanaen   (20.09.2011 в 11:07)   письмо автору
 
   для: tima2010   (20.09.2011 в 11:00)
 

ну попробуйте тогда так:


<?php
$query 
"SELECT * FROM mytable ORDER BY `myid`";
$res mysql_query($query) or die(mysql_error());
while (
$row mysql_fetch_array($res)) 
    
$tmp[] = $row;

$i=0;
foreach(
$_POST['myarray'] as $key=> $value) { // раскрываем массив
    
    
$valuearr$tmp[$i]['myaddtext'].$value// к содержимому тексту массива добавляем из базы текст
    
$valuearrfull[$key] = $valuearr;  // формируем обратно массив
     
$i++;  
}

echo 
"<pre>";  
print_r($valuearrfull);  
echo 
"<pre>"


/*
Array  
(  
    [myarray] => Array  
        (  
            [5] => Добавили текст 1 ТЕКСТ ПЯТЫЙ // верно
            [5] => Добавили текст 2 ТЕКСТ ПЯТЫЙ // НЕ ВЕРНО должен быть шестой
        )  

    [mybutton] => Submit  
)
*/
?>

  Ответить  
 
 автор: tima2010   (20.09.2011 в 11:40)   письмо автору
 
   для: Lotanaen   (20.09.2011 в 11:07)
 

хм, что то не то, проблема в этой строке

$valuearr= $row['myaddtext'].$value; // цикл на данный момент состоит из двух элементов но $value принимает только первое значение...


здесь $value принимает только первое значение цикла а нужно первое и второе

  Ответить  
 
 автор: Lotanaen   (20.09.2011 в 11:59)   письмо автору
 
   для: tima2010   (20.09.2011 в 11:40)
 

что в итоге вы хотите получить? вот у вас два массива, например: (1,2,3,4) из $_POST и (5,6) из БД - что в итоге должно быть, не совсем понятно...

  Ответить  
 
 автор: Lotanaen   (20.09.2011 в 12:03)   письмо автору
 
   для: tima2010   (20.09.2011 в 11:40)
 

возможно так?

<?php
$query 
"SELECT * FROM mytable ORDER BY `myid`";
$res mysql_query($query) or die(mysql_error());
$i=0;
foreach(
$_POST['myarray'] as $key=> $value) { // раскрываем массив
    
while ($row mysql_fetch_array($res)) { // получаем текст из базы который нам нужен
    
        
$valuearr$row['myaddtext'].$value// к содержимому тексту массива добавляем из базы текст
        
$valuearrfull[$i] = $valuearr;  // формируем обратно массив
        
$i++;
    }
}

echo 
"<pre>";  
print_r($valuearrfull);  
echo 
"<pre>"


/*
Array  
(  
    [myarray] => Array  
        (  
            [5] => Добавили текст 1 ТЕКСТ ПЯТЫЙ // верно
            [5] => Добавили текст 2 ТЕКСТ ПЯТЫЙ // НЕ ВЕРНО должен быть шестой
        )  

    [mybutton] => Submit  
)
*/
?>

  Ответить  
 
 автор: tima2010   (22.09.2011 в 13:17)   письмо автору
 
   для: Lotanaen   (20.09.2011 в 12:03)
 

попробую объяснить проще, что не получается


<?php  

$query 
"SELECT * FROM mytable";  
$res mysql_query($query) or die(mysql_error());  

foreach(
$_POST['myarray'] as $key=> $value)  
{  
echo 
$value.", "// при выводе покажет нам 5, 6
while ($row mysql_fetch_array($res)) {  
$valuearr$row['myaddtext'].$value;  // здесь  $value при выводе покажет нам только 5, почему то не передается второе значение переменной 
$valuearrfull[$key]=$valuearr;  
}  
}  

echo 
"<pre>";  
print_r($valuearrfull);  
echo 
"<pre>";  

?>

  Ответить  
 
 автор: tima2010   (22.09.2011 в 13:28)   письмо автору
 
   для: tima2010   (22.09.2011 в 13:17)
 

получается почему то в цикле foreach цикл while выполняется всего 1 раз... (((((

  Ответить  
 
 автор: cheops   (22.09.2011 в 13:30)   письмо автору
 
   для: tima2010   (22.09.2011 в 13:17)
 

Дело в том, что при проходе по результирующей таблице, указатель остается в конце, чтобы снова запустить просмотр результирующей таблицы, его нужно установить в начало. Т.е. ваш скрипт скорее всего должен выглядеть так
<?php   
$query 
"SELECT * FROM mytable";   
$res mysql_query($query) or die(mysql_error());   

foreach(
$_POST['myarray'] as $key=> $value)   
{   
  echo 
$value.", "// при выводе покажет нам 5, 6 
  // Устанавливаем указатель в начало результирующей таблицы
  // на каждой итерации цикла
  
mysql_data_seek($res0);
  
// Теперь со спокойной душой читаем записи от начала
  // результирующей таблицы до конца
  
while ($row mysql_fetch_array($res)) {   
    
$valuearr$row['myaddtext'].$value;  
    
$valuearrfull[$key]=$valuearr;   
  }   
}   

echo 
"<pre>";   
print_r($valuearrfull);   
echo 
"<pre>";   
?>

  Ответить  
 
 автор: Lotanaen   (22.09.2011 в 13:30)   письмо автору
 
   для: tima2010   (22.09.2011 в 13:17)
 

так вы же запрос при втором проходе не делаете, т.е. тогда нужно так:

<?php  

//$query = "SELECT * FROM mytable";  
//$res = mysql_query($query) or die(mysql_error());  

foreach($_POST['myarray'] as $key=> $value)  
{  
echo 
$value.", "// при выводе покажет нам 5, 6
$query "SELECT * FROM mytable";  
$res mysql_query($query) or die(mysql_error());  
while (
$row mysql_fetch_array($res)) {  
$valuearr$row['myaddtext'].$value;  // здесь  $value при выводе покажет нам только 5, почему то не передается второе значение переменной 
$valuearrfull[$key]=$valuearr;  
}  
}  

echo 
"<pre>";  
print_r($valuearrfull);  
echo 
"<pre>";  

?> 

а лучше в массив сначала загнать и потом массив через foreach прогнать... ну или так как выше предложили...

  Ответить  
 
 автор: tima2010   (22.09.2011 в 13:47)   письмо автору
 
   для: Lotanaen   (22.09.2011 в 13:30)
 

Уважаемые cheops и Lotanaen, спасибо за терпение но в обоих случаях теперь принимается только второе значение переменной $value в цикле... (

p.s. сошел с ума

  Ответить  
 
 автор: cheops   (22.09.2011 в 13:52)   письмо автору
 
   для: tima2010   (22.09.2011 в 13:47)
 

Как у вас сейчас выглядит скрипт и что он выводит?

  Ответить  
 
 автор: tima2010   (22.09.2011 в 14:07)   письмо автору
 
   для: cheops   (22.09.2011 в 13:52)
 

Код скрипта:

В sql есть данные:
sorting - порядок отображения
myaddtext - добавляемый текст

Форма:

<form method="POST" action="index.php" name="update">
<?php
$query 
"SELECT * FROM mytable ORDER BY `sorting`";
$res mysql_query($query) or die(mysql_error());
while (
$row mysql_fetch_array($res)) {
echo 
'<input type="text" name="myarray['.$row['sorting'].']"> <br />'// где sorting это порядок отображения
}
?>
<input type="submit" value="Go" name="mybutton">
</form>


После нажатия к каждому введенному тексту через INPUT TEXT нужно добавить значение myaddtext из базы данных И при этом сохранить массив

Обработка массива:


<?php
if (isset($_POST['mybutton'])) {

$query "SELECT * FROM mytable ORDER BY `sorting`";
$res mysql_query($query) or die(mysql_error());
foreach(
$_POST['myarray'] as $key => $value)
{
while (
$row mysql_fetch_array($res)) {
$valuearr $row['myaddtext']." - ".$value// сюда не могу передать все значения что бы к каждому добавить нужный текст, передается только первое значение массива myarray
$valuearrfull[$row['sorting']] = $valuearr;  
}
}

}
?>


в этом коде выводит

Array 

    [5] => Добавили текст 1 текст ПЯТЫЙ // верно  
    [6] => Добавили текст 2 текст ПЯТЫЙ // не верно, должен быть текст ШЕСТОЙ



примерно так

  Ответить  
 
 автор: Lotanaen   (22.09.2011 в 13:57)   письмо автору
 
   для: tima2010   (22.09.2011 в 13:47)
 

я же вам приводил пример раньше - вас он чем-то не устроил...


<?php
$query 
"SELECT * FROM mytable ORDER BY `myid`";
$res mysql_query($query) or die(mysql_error());
while (
$row mysql_fetch_array($res)) 
    
$tmp[] = $row;

$i=0;
foreach(
$_POST['myarray'] as $key=> $value) { // раскрываем массив
    
    
$valuearr$tmp[$i]['myaddtext'].$value// к содержимому тексту массива добавляем из базы текст
    
$valuearrfull[$key] = $valuearr;  // формируем обратно массив
     
$i++;  
}

echo 
"<pre>";  
print_r($valuearrfull);  
echo 
"<pre>"


/*
Array  
(  
    [myarray] => Array  
        (  
            [5] => Добавили текст 1 ТЕКСТ ПЯТЫЙ // верно
            [5] => Добавили текст 2 ТЕКСТ ПЯТЫЙ // НЕ ВЕРНО должен быть шестой
        )  

    [mybutton] => Submit  
)
*/
?> 

  Ответить  
 
 автор: tima2010   (22.09.2011 в 14:18)   письмо автору
 
   для: Lotanaen   (22.09.2011 в 13:57)
 

пожалуйста извините вариант рабочий я не верно понял принцип его работы...

одна проблема в этом варианте, добавляется лишнее значение


Array
(
    [] => ТЕКСТ ШЕСТОЙ
    [5] => Добавили текст 1 ТЕКСТ ПЯТЫЙ // верно 
    [6] => Добавили текст 2 ТЕКСТ ШЕСТОЙ // верно 
)


будто foreach насчитал 3 а не 2

зачем то пихает последнее значение $value еще раз

  Ответить  
 
 автор: tima2010   (22.09.2011 в 15:03)   письмо автору
 
   для: tima2010   (22.09.2011 в 14:18)
 

придется удалять первое значение массива типа unset ?

  Ответить  
 
 автор: Lotanaen   (22.09.2011 в 15:11)   письмо автору
 
   для: tima2010   (22.09.2011 в 14:18)
 

а вы этот массив ранее не используете? перед циклом объявите его

  Ответить  
 
 автор: tima2010   (22.09.2011 в 15:15)   письмо автору
 
   для: Lotanaen   (22.09.2011 в 15:11)
 

не используется :( перед циклом получаю:


Array
(
    [5] => Текст пятый 
    [6] => Текст шестой
)


сразу после вашего способа вывожу массив вижу:

Array 

    [5] => Добавили текст 1 ТЕКСТ ПЯТЫЙ // верно 
    [] => ТЕКСТ ШЕСТОЙ 
    [6] => Добавили текст 2 ТЕКСТ ШЕСТОЙ // верно  

  Ответить  
 
 автор: Lotanaen   (22.09.2011 в 15:38)   письмо автору
 
   для: tima2010   (22.09.2011 в 15:15)
 

а такой вариант попробуйте:


<?php

if (sizeof($_POST['myarray'])) {
    
    
$valuearrfull = array();
    
$query "SELECT * FROM mytable ORDER BY `sorting`";
    
$res mysql_query($query) or die(mysql_error());
    while (
$row mysql_fetch_array($res)) 
        
$valuearrfull[$row['sorting']] = $row['myaddtext']." - ".$_POST['myarray'][$row['sorting']];

}


echo 
"<pre>";  
print_r($valuearrfull);  
echo 
"<pre>"

?>

  Ответить  
 
 автор: tima2010   (22.09.2011 в 15:23)   письмо автору
 
   для: Lotanaen   (22.09.2011 в 15:11)
 

Все понял! Лишние скобки поставил....
Спасибо Lotanaen!!!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования