Matriz Multidimensional para String

Eu estou tentando converter uma matriz multidimensional em uma seqüência de caracteres com um formato específico.

function convert_multi_array($array) {
    foreach($array as $value) {
        if(count($value) > 1) {
            $array = implode("~", $value);
        }
        $array = implode("&", $value);
    }
    print_r($array);
}
$arr = array(array("blue", "red", "green"), array("one", "three", "twenty"));
convert_multi_array($arr);

Deve saída:blue~red~green&one~three~twenty ... e assim por diante, para mais sub-matrizes.

Deixe-me apenas dizer que não consegui produzir nenhum código que esteja remotamente próximo dos resultados desejados. Depois de duas horas, isso é praticamente o melhor que posso conseguir. Eu não sei porque os implodes estão agindo de forma diferente do que eles costumam fazer para seqüências de caracteres ou talvez eu não estou apenas olhando para este direito. Você é capaz de usar implodir para valores de matrizes?

 ajon07 de set de 2012 00:03
qual é a sua saída
 Tony The Lion07 de set de 2012 00:04
Fazer um loop sobre um array multidimensional de qualquer tipo normalmente requer dois loops aninhados. Faça um loop sobre o primeiro array, depois faça um loop sobre o segundo array, quando terminar, mova para o próximo array, dê um loop sobre ele. Etc
 Shmiddty07 de set de 2012 00:04
uma pesquisa de 5 segundos no google revelou isto:php.net/manual/en/function.join.php Nos comentários, você encontrará um snippet de associação recursivo que deve atender às suas necessidades.

questionAnswers(7)

Salvando as matrizes internas implodidas em uma matriz. Então implodindo isso.

(escrito no espírito da sua implementação original)

function convert_multi_array($arrays)
{
    $imploded = array();
    foreach($arrays as $array) {
        $imploded[] = implode('~', $array);
    }
    return implode("&", $imploded);
}
 user163199507 de set de 2012 00:12
Ah sim, o espírito disso. Eu deveria ter pedido ajuda mais cedo, o código que eu postei foi uma confusão depois de muitas horas batendo minha cabeça.

Olha a minha versão. Implode qualquer dimensão:

function implode_all($glue, $arr){            
    for ($i=0; $i<count($arr); $i++) {
        if (@is_array($arr[$i])) 
            $arr[$i] = implode_all ($glue, $arr[$i]);
    }            
    return implode($glue, $arr);
}

Aqui está o exemplo:

echo implode_all(',', 
array(
1,
2,
array('31','32'),
array('4'),
array(
  array(511,512), 
  array(521,522,523,524),
  53))
);

Vai imprimir:

1,2,31,32,4,511,512,521,522,523,524,53
 Jeff_Alieffson30 de jun de 2017 20:15
Sim! Em vez de is_array ($ arr [$ i]) escreva @is_array ($ arr [$ i]) já mudei no código.
 Abraham Murciano Benzadon02 de jul de 2017 07:48
Obrigado. Outra solução que eu agitei antes de você me falar sobre o @, foi converter o array em um numérico no começo da função.
 Abraham Murciano Benzadon01 de jul de 2017 22:46
Obrigado, mas o que o @ faz? Eu tentei googling, mas eu não encontrei a documentação ... Obrigado
 Jeff_Alieffson02 de jul de 2017 07:39
 Abraham Murciano Benzadon30 de jun de 2017 16:36
Ótima resposta! mas existe alguma maneira de evitarNotice: Undefined offset: 0 in... para matrizes associativas? obrigado

Aqui está uma resposta simples:

    function implode_recur ($separator, $arrayvar){
        $output = "";
         foreach ($arrayvar as $av)
         {
             if (is_array ($av))
             {
                $output .= implode_r ($separator, $av);
             }
            else
            {
                $output .= $separator.$av;
            }
    ,        return $output;
         }
    }
    $result = implode_recur(">>",$variable);

Ok codificação feliz!

PHP (http://php.net/manual/en/function.join.php)

function joinr($join, $value, $lvl=0)
{
    if (!is_array($join)) return joinr(array($join), $value, $lvl);
    $res = array();
    if (is_array($value)&&sizeof($value)&&is_array(current($value))) { // Is value are array of sub-arrays?
        foreach($value as $val)
            $res[] = joinr($join, $val, $lvl+1);
    }
    elseif(is_array($value)) {
        $res = $value;
    }
    else $res[] = $value;
    return join(isset($join[$lvl])?$join[$lvl]:"", $res);
}

$arr = array(array("blue", "red", "green"), array("one", "three", "twenty"));
joinr(array("&", "~"), $arr);

Isso é recursivo, então você ainda pode fazer

$arr = array(array("a", "b"), array(array("c", "d"), array("e", "f")), "g");
joinr(array("/", "-", "+"), $arr);

e você vai conseguir

a-b/c+d-e+f/g

$output = implode(", ",array_map(function($a) { return '<a href="'.$a['slug'].'">'.$a['name'].'</a>'; }, $your_array) );

print_r($output);

Saída:

Link1, Link2, Link3

QuestionSolution

Você está sobrescrevendo$array, que contém o array original. Mas em umforeach uma cópia de$array está sendo trabalhado, então basicamente você está apenas atribuindo uma nova variável.

O que você deve fazer é percorrer as matrizes filho e "convertê-las" em cadeias de caracteres e implodir o resultado.

function convert_multi_array($array) {
  $out = implode("&",array_map(function($a) {return implode("~",$a);},$array));
  print_r($out);
}
 user163199507 de set de 2012 00:09
Obrigado por isso, vou estudar como isso funciona, pois muitas das minhas perguntas foram respondidas com "array_map".

mas eu precisava para relatar uma matriz aninhada que continha erros, então eu simplesmente definido uma variável e, em seguida, com json_encode colocar isso no meu e-mail. Uma maneira de converter um array em uma string.

yourAnswerToTheQuestion