1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[PHP] Converter array multidimensional em unidimensional

Discussão em 'Web Development' iniciada por Armadillo, 10 de Dezembro de 2007. (Respostas: 8; Visualizações: 3858)

  1. Armadillo

    Armadillo Folding Member

    Ola pessoal.
    Entao e assim , tenho o codigo em php que pesquisa todos os directorios que existem num dado directorio pai.
    O que se passa e que o meu algoritmo retorna o resultado num array multidimensional.

    Ja tentei utilizar o array_merge mas so me retorna um vector com os valores "array", "array", "array", ........

    Existe alguma forma de tornar um array multidimensional em unidimensional?

    Obrigado
     
  2. mcog_blaster

    mcog_blaster Power Member

    Tenta:

    Código:
    $arr[0][] = "0,0";
    $arr[0][] = "0,1";
    $arr[0][] = "0,2";
    $arr[0][] = "0,3";
    $arr[0][] = "0,4";
    $arr[1][] = "1,0";
    $arr[1][] = "1,1";
    $arr[1][] = "1,2";
    $arr[1][] = "1,3";
    $arr[1][] = "1,4";
    
    foreach($arr as $key => $arr_uni)
    {
      foreach($arr_uni as $key2 => $value)
      {
        $new_arr_uni[] = $value;
      }
    }
    
    var_dump($arr);
    var_dump($new_arr_uni);
    
    resultado:

    Código:
    array(2) {
      [0]=>
      array(5) {
        [0]=>
        string(3) "0,0"
        [1]=>
        string(3) "0,1"
        [2]=>
        string(3) "0,2"
        [3]=>
        string(3) "0,3"
        [4]=>
        string(3) "0,4"
      }
      [1]=>
      array(5) {
        [0]=>
        string(3) "1,0"
        [1]=>
        string(3) "1,1"
        [2]=>
        string(3) "1,2"
        [3]=>
        string(3) "1,3"
        [4]=>
        string(3) "1,4"
      }
    }
    array(10) {
      [0]=>
      string(3) "0,0"
      [1]=>
      string(3) "0,1"
      [2]=>
      string(3) "0,2"
      [3]=>
      string(3) "0,3"
      [4]=>
      string(3) "0,4"
      [5]=>
      string(3) "1,0"
      [6]=>
      string(3) "1,1"
      [7]=>
      string(3) "1,2"
      [8]=>
      string(3) "1,3"
      [9]=>
      string(3) "1,4"
    }
    
    Funciona "bem" senao estiveres interessado nas chaves, porque quando ha colisao de chaves perdes informaçao.
     
  3. Tyran

    Tyran Power Member

    Já viste aqui http://pt.php.net/array, julgo que faz uma referencia para isso... mas não tenho a certeza que seja bem isso
    Não podes passar isso por referência presumo?
    cumpzz
     
  4. Armadillo

    Armadillo Folding Member

    mcog_blaster, obrigado pelo reply, mas acho q nao e possivel utilizar a tua sugestao, pq este meu vector tem uma dimensao nao definida, depende das directorias que o script encontrar.

    Tyran, ja procurei la, n tem nada que satisfaça as minhas necessidade, mas mesmo assim, obrigado pelo a ajuda.
    O que querias dizer com " Não podes passar isso por referência presumo?". Passar o quê pra onde?

    Obrigado
     
  5. shello

    shello Moderador
    Staff Member

    Uma ideia talvez muito primitiva é percorrer o array principal (eventualmente passando os valores para outro array "auxiliar") e, de cada vez que encontras um array, ele vai percorre-lo para fazer o mesmo: ir retirar os valores.

    Isto na teoria deve funcionar (no fundo passa por uma função de percorrer a chamar-se a ela própria de cada vez que encontra um array, recursivamente as vezes que forem necessárias)), mas cheira-me que há formas mais eficientes de fazer isto.
     
  6. Armadillo

    Armadillo Folding Member

    Se eu fizer isto:
    Código:
    function listaArray(&$item2, $key)
    {
        echo "$item2<br>\n";
        array_walk($item2, 'listaArray');
    }
    
    
    $array = pesquisa_dir_recursivamente('..');     //ler disco em busca de dirs
    array_walk($array, 'listaArray');                //retornar apenas as dirs
    
    
    a funçao printa tudo como eu quero, mas como é qu eu mando isto num array para fora??
     
    Última edição: 11 de Dezembro de 2007
  7. Armadillo

    Armadillo Folding Member

    Acho que é isto:
    Código:
    function listaArray(&$item2, $key)
    {
    global $pastas;
        //echo "$item2<br>\n";
        if (!is_array($item2) && !is_null($item2))
            {
            $pastas[]=$item2;
            }
        array_walk($item2, 'listaArray');
    }
    
    o vector de retorno é $pastas.
    O q acham?
     
    Última edição: 11 de Dezembro de 2007
  8. Tyran

    Tyran Power Member

    Tipo ao chamares a função que faz isso mandas como parâmetro o array na função onde irás meter as dirs que queres, se fizeres isso por referência, com o & ele altera o valor sem que tenhas de retornar nada...
    Pelo menos comigo aqui numa coisinha simples resultou
    Se estou a perceber mal, desculpa
    cumpzz
     
    Última edição: 11 de Dezembro de 2007
  9. K0mA

    K0mA Power Member

    $multi
    PHP:
    Array
    (
        [
    0] => 1
        
    [1] => 2
        
    [2] => 3
        
    [3] => Array
            (
                [
    0] => 1.1
                
    [1] => 1.2
                
    [2] => 1.3
                
    [3] => Array
                    (
                        [
    key] => hummmm
                    
    )
            )
    )
    $junto
    PHP:
    Array
    (
        [
    0] => 1
        
    [1] => 2
        
    [2] => 3
        
    [3] => 1.1
        
    [4] => 1.2
        
    [5] => 1.3
        
    [6] => hummmm
    )
     
    A função que fez isto:
    PHP:
    function unidim ($arr) {
    global 
    $junto;
    foreach (
    $arr as $v) {
    if (!
    is_array($v)) {
    $junto[]=$v;
    }
    else {
    unidim ($v);
    }
    }
    }
     
     
    Repara que as chaves não aparecem apenas os valores key=>"humm" apenas "humm" aparece.
    Penso que seja isto.
     
    Última edição: 11 de Dezembro de 2007

Partilhar esta Página