[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обход всех элементов многомерного массива
MainVoid
Всем доброго времени суток!

Возникла такая задача: необходимо перевести каждый элемент массива в другую кодировку.

Не получается сделать код, который для меня это сделает, получилось пока вот что:

PHP
<?
    
$objects = array(
        
"window" => array("open",      "close" => array("yes""no"), "alert"),
        
"history"  => array("back""forward""go(n)"),
        
"location" => array("assign""reload""replace"),
        
"q"=>1
    
);
    
$i 1;
    function 
test(&$data) {
        global 
$i;
        foreach (
$data as $key => $val) {
            for(
$q=0$q<$i$q++) {
                echo 
'--';
            }
            echo 
'<b>'.$key.'</b><br>';
            if (
is_array($val)) {
                
$i++;
                
test($val);
                
$i--;
            }
            else {
                for(
$q=0$q<$i$q++) {
                    echo 
'--';
                }
                echo 
$val.'<br>';
            }
        }
    }
    
test($objects0);
    echo 
'<pre>'print_r($objects); echo '</pre>'


Скрипт обходит все элементы и даже строит какое то подобие tree. Но как сделать, чтобы он вносил изменения в массив $objects?





Спустя 2 часа, 56 минут, 48 секунд (9.04.2009 - 04:30) Joker написал(а):
Держи, любая многомерность. Или вообще, одномерный можешь, или просто строку.
PHP
<?php

 $objects 
= array(
        "Окно" => array("open",      "close" => array("yes", "no"), "alert"),
        "history"  => array("back", "forward", "go(n)"),
        "location" => array("assign", "reload", "replace")
        );


function encoding(&$data,$in,$to)
{
    if (is_array($date)
    {
        foreach($data as $key => $value)
        {
            if ( is_array($data[$key]) )
            {
                encoding($data[$key],$in,$to);
            }
            else
            
{
                $data[$key] = iconv($in,$to,$value);
            }
        }
    }
    else
    
{
        $data = iconv($in,$to,$data);
    }
}
    encoding($objects,"UTF-8","WINDOWS-1251");
    echo '<pre>';
    print_r($objects);
    echo '</pre>';

Спустя 4 часа, 47 минут, 31 секунда (9.04.2009 - 09:18) glock18 написал(а):
2 Joker: все должно работать. Только исправить опечатку надо
PHP
if (is_array($date))

на
PHP
if (is_array($data))


На самом деле, все это можно сделать гораздо проще. Насколько я помню, есть встроенная функции для всего этого
http://ru2.php.net/manual/ru/function.arra...k-recursive.php

Спустя 1 час, 3 минуты, 17 секунд (9.04.2009 - 10:21) MainVoid написал(а):
Спасибо большое, Joker, за скрипт, и спасибо glock18 за функцию! array_walk видел, а array_walk_recursive нет.

Спустя 28 минут, 9 секунд (9.04.2009 - 10:49) MainVoid написал(а):
А как можно сами ключи перекодировать?

Спустя 1 час, 6 минут, 1 секунда (9.04.2009 - 11:55) glock18 написал(а):
С ключами сложнее получится. Придется новый массив (так лучше) создавать, а не это изменять по ссылке.

Для этого лучше, наверно, будет функция Joker'а, переписанная таким образом примерно:

PHP
...
        foreach(
$data as $key => $value)
        {
            if ( 
is_array($data[$key]) )
            {
                
encoding($data[$key],$in,$to);
            }
            else
            {
                
$dataOut[encoding($key,$in,$to)] = iconv($in,$to,$value);
            }
        }
...


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

Можно сразу удалять старый ключ, в принципе, таким образом:
PHP
$data[encoding($key,$in,$to)] = iconv($in,$to,$value);
$data[$key] = null;

Спустя 1 час, 23 минуты, 51 секунда (9.04.2009 - 13:19) MainVoid написал(а):
Окей, попробую, спасибо


_____________
Каная
Быстрый ответ:

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