Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Como unir índices de um array.

Atualmente possuo essa estrutura :

array(9) {
  [0]=>
  array(2) {
    ["NMLOCAL"]=>
    string(19) "Banheiro | Banheiro"
    ["NMCRITERIOTARGERCHK"]=>
    string(35) "Não foi trocado o papel higiênico"
  }
  [1]=>
  array(2) {
    ["NMLOCAL"]=>
    string(19) "Banheiro | Banheiro"
    ["NMCRITERIOTARGERCHK"]=>
    string(16) "A pia está suja"
  }
  [2]=>
  array(2) {
    ["NMLOCAL"]=>
    string(19) "Banheiro | Banheiro"
    ["NMCRITERIOTARGERCHK"]=>
    string(36) "Não foi colocado outro saco de lixo"
  }
}

Preciso unir os índices para que fique os dois ["NMCRITERIOTARGERCHK"] em apenas um ["NMLOCAL"];

5 respostas

Fala Diego, beleza?

Não entendi bem como você quer a estrutura final do array, pode exemplificar?

Eu preciso unir todos os ["NMCRITERIOTARGERCHK"] onde os ["NMLOCAL"] for "Banheiro | Banheiro"

Ae a grosso modo e não sei se você vai entender precisaria que ficasse assim:

["NMLOCAL"]=>
   string(19) "Banheiro | Banheiro"
["NMCRITERIOTARGERCHK"] => "Não foi colocado outro saco de lixo", "A pia está suja" "Não foi trocado o papel higiênico".
solução!

Então Diego,

Veja se isso serve para você, tem soluções mais flexíveis e até menores mas deve te dar uma idéia:


$result = array_reduce($arr, function($p, $v){
    $p["NMLOCAL"] .=  $v["NMLOCAL"] . ', ';
    $p["NMCRITERIOTARGERCHK"] .= $v["NMCRITERIOTARGERCHK"].  ', ';

    return $p;    
}, []);

Esse $arr, que corresponde ao primeiro parâmetro, é esse seu array que vc irá passar para a função. Se tiver complicado para você entender posso escrever uma solução usando foreach mas terá bem mais linhas de código.

Confesso que fiquei um pouco confuso com o funcionamento do array_reduce, você poderia me mostrar a solução utilizando foreach?

Veja se ficar melhor para você:


function juntaIndincesDeUmArrayRecursivo($arr, &$novoArray)
{   

    foreach($arr as $chave => $elemento){
        if(is_array($elemento)){
            juntaIndincesDeUmArrayRecursivo($elemento, $novoArray);
        }

        if(array_key_exists($chave, $novoArray)){
            $novoArray[$chave] .= $arr[$chave] . ' ';
        }
    }

    return $novoArray;
}

$arr = [
    [
        "NMLOCAL"=> "Banheiro | Banheiro",
        "NMCRITERIOTARGERCHK"=> "Não foi trocado o papel higiênico"
    ],

    [
        "NMLOCAL"=> "Banheiro | Banheiro",
        "NMCRITERIOTARGERCHK"=> "A pia está suja"
    ],

    [
        "NMLOCAL"=> "Banheiro | Banheiro",
        "NMCRITERIOTARGERCHK"=> "Não foi colocado outro saco de lixo"
    ]

];


$indices = ['NMLOCAL' => '', 'NMCRITERIOTARGERCHK'=> '' ];

$cc = juntaIndincesDeUmArrayRecursivo($arr, $indices);

var_dump($cc);

São dois parâmetros nessa função, o primeiro $arr é o array sobre o qual vc quer iterar e o segundo parametro $indices é um array com os quais indices vc quer obter.

No foreach tem dois ifs. O primeiro verifica se o elemento é um array e caso seja chama a função novamente até cair no segundo if que faz a verificação se existem chaves iguais em ambos arrays ($arr e $indices) e caso exista concatena o valor de $arr em $indices. Essa solução é mais flexivel pq vc pode trabalhar com quaisquer indices e caso não queira só concatenar, mas sim por uma virgula ou outra coisa dá para alterar.

Mas não use essa solução no dia a dia, por que pode ter bugs, é só de caráter didático para vc ter uma noção de como juntaria esses indices.