Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > преобразование массивов


Автор: youri 1.8.2008, 18:56
мне нужно, чтобы сохранялись ссылки при преобразовании ассоциативный массив <=> массив с числовыми индексами, т.е. в результате подобного кода
Код

$a = 1;
$b = array('asd', &$a);
for( $i=0; $i<count($b); $i+=2 )
    $c[ $b[$i] ] = $b[$i+1];
$a = 2;
print_r($c);

должны видеть 2 (и ключ естественно)
вот это тоже не работает как мне нужно (по понятным причинам)
Код

$a = 1;
$b = array('asd'=>&$a);
foreach( $b as $k=>$v ) {
    $c[] = $k;
    $c[] = $v;
}
$a = 2;
print_r($c);

но у меня в коде (а не в этих тестовых примерах) по идее происходит такое преобразование с почему-то сохранением ссылок (я еще не до конца разобрался)
если у кого будут идеи, они будут всячески приветствоваться  smile 

Автор: sTa1kEr 2.8.2008, 11:23
http://ru.php.net/foreach
Цитата

As of PHP 5, you can easily modify array's elements by preceding $value with &. This will assign reference instead of copying the value. 

Код

$a = 1;
$b = array('asd' => &$a);
foreach( $b as $k => &$v ) {
    $c[] = $k;
    $c[] = &$v;
}
$a = 2;
print_r($c);

Автор: youri 4.8.2008, 09:39
тоже вариант, но я решил в начало ключа, по которому содержится ссылка, добавлять &
Код

$a = 1;
$b = array('&asd' => &$a);
foreach( $b as $k => &$v ) {
    $c[] = $k;
    if( $k{0} == '&' )
        $c[] = &$v;
    else
        $c[] = $v;
}
$a = 2;
print_r($c);

т.е. я в общем-то не говорил, что такое приемлемо smile

Добавлено через 1 минуту и 18 секунд
т.е. разница в принципе небольшая - меньше шансов случайно что-то не то поменять

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)