problems with (array) object

2

I have a array of objects .

Ex:

$array = array (1=$obj1, 2=$obj2...ect)

It turns out that I'm converting these objects into arrays also to have an array of arrays instead of a Array of objects with the purpose of transforming it into a array JSON .

  $todos = $produtosDao->pesquisaProdutos(); 

  foreach ($todos as $cada):

     $produto[] = (array) $cada;

  endforeach;

Well, when I do print_r($produto) , I have on screen the following: Note: I will only post here the first record so that the post is not too long?

Array
(
    [0] => Array
        (
            [ProdutosidProduto] => 1
            [Produtostipo] => mp
            [Produtosmodelo] => F540 2 BAN.PNEU. 100 X 60
            [Produtosbandejas] => 2
            [Produtospeso] => 0
            [Produtosprensagem] => 0
            [ProdutosprecoUnitario] => 6500
            [Produtoscomprimento] => 100
            [Produtoslargura] => 60
            [Produtoscabo] => 0
            [Produtosligacao] => n
            [Produtospotencia] => 0
            [Produtosconsumo] => 0
            [Produtoscorrente] => 0
            [Produtosdisjuntor] => 0
            [Produtosdescricao] => 
Valor promocional limitado frete grátis ,para SP ,RJ ,MG ,ES. Os demais será cobrado apenas de SP para sua cidade ,valor de 500,00 ,a ser pago na entrega .



MAQUINA TOTALMENTE INDUSTRIAL E 100% NACIONAL .PRODUÇÃO DE ATÉ MIL PÇS POR DIA EM HORÁRIO NORMAL DE TRABALHO ,SISTEMA DIGITAL AUTOMATIZADO DE ÚLTIMA GERAÇÃO , SISTEMA PNEUMÁTICO COMPACTO E UNIFORME RECEBENDO A MESMA PRESSÃO EM TODA ÁREA DE ESTAMPAGEM, EVITANDO ASSIM OS SOMBREAMENTOS E EFEITOS FANTASMA NA ESTAMPA , SISTEMA DE RESISTÊNCIA DE ALTA QUALIDADE A MELHOR DO MERCADO AÇO INOX 304 , DANDO UMA VIDA ÚTIL MUITO SUPERIOR AS DEMAIS DO MERCADO , E FÁCIL TROCAS DAS RESISTÊNCIAS NÃO SENDO NECESSÁRIO TÉCNICO NO LOCAL , COM APENAS 4 PARAFUSOS O CLIENTE MESMO FAZ A TROCA, AS DEMAIS A RESISTÊNCIA É FUNDIDA NA CHAPA DE ALUMÍNIO SENDO IMPOSSÍVEL A TROCA APENAS DAS RESISTÊNCIAS , TEMOS TODAS AS PÇS DA PRENSA EM VALORES BEM ACESSÍVEIS. 
            [Produtosestoque] => 7
            [ProdutosfreteGratis] => s
            [Produtosbloqueado] => n
        )

When I go to see the source code,

asked by anonymous 03.12.2018 / 14:05

1 answer

2

The problem seems to be in the conversion to array, in the code:

$produto[] = (array) $cada

If you read the PHP documentation where you talk about arrays, more specifically in the session " Converting to Array " will note that PHP behaves differently when converting an object derived from a class that is not stdClass .

What happens is that PHP creates, for each property of the object, a key in the new converted array. However, this key is prefixed with null characters ( print_rNomeClasseecho*Produto ), serialized class name, and property names. Where:

  • public : Does not change the name of the property. Ex.:

    public $teste = 'valor';
    

    It becomes:

    'teste' => 'valor'
    
  • protected : prefix the property name with private (null + * + null). Ex .:

    protected $teste = 'valor';
    

    It becomes:

    "
    class MinhaClasse {
        private $teste = 'valor';
    }
    
    *
    "
    <?php
    
    class Teste
    {
        public $prop_public;
        protected $prop_protected;
        private $prop_private;
    
        public function __construct()
        {
            $this->prop_public = 'public';
            $this->prop_protected = 'protected';
            $this->prop_private = 'private';
        }
    }
    
    $obj = new Teste;
    $arr = (array) $obj;
    
    print_r($arr);
    
    foreach ($arr as $key => $value) {
        // converte 
    Array
    (
        [prop_public] => public
        [*prop_protected] => protected
        [Testeprop_private] => private
    )
    
    para \0 para ficar visível $key_null = str_replace("
    [prop_public] => public
    [
    str_replace("
    str_replace('\u0000', '', json_encode($var));
    
    ", '', $chave);
    *
    $produto[] = (array) $cada
    
    prop_protected] => protected [
    public $teste = 'valor';
    
    Teste
    'teste' => 'valor'
    
    prop_private] => private
    ", '
    protected $teste = 'valor';
    
    ', $key); echo "[$key_null] => $value\n"; }
    MinhaClasse
    "
    class MinhaClasse {
        private $teste = 'valor';
    }
    
    *
    "
    <?php
    
    class Teste
    {
        public $prop_public;
        protected $prop_protected;
        private $prop_private;
    
        public function __construct()
        {
            $this->prop_public = 'public';
            $this->prop_protected = 'protected';
            $this->prop_private = 'private';
        }
    }
    
    $obj = new Teste;
    $arr = (array) $obj;
    
    print_r($arr);
    
    foreach ($arr as $key => $value) {
        // converte 
    Array
    (
        [prop_public] => public
        [*prop_protected] => protected
        [Testeprop_private] => private
    )
    
    para \0 para ficar visível $key_null = str_replace("
    [prop_public] => public
    [
    str_replace("
    str_replace('\u0000', '', json_encode($var));
    
    ", '', $chave);
    *%pre%prop_protected] => protected [%pre%Teste%pre%prop_private] => private
    ", '%pre%', $key); echo "[$key_null] => $value\n"; }
    MinhaClasse%pre%teste" => "valor"
    teste" => "valor"
    teste" => "valor"
    teste" => "valor"
  • private : prefixes the name of the property with toArray() . Ex .:

    %pre%

    It becomes:

    %pre%

I understand this makes it easy to formulate a test to see what's happening with your code:

%pre%

Code running on Repl.it

Output from %code% :

%pre%

Output from %code% :

%pre%

In this way I can know that the properties of your class %code% are %code% , and as shown in the above code, you can remove these null characters using:

%pre%

Note that double quotation marks must be used in %code% otherwise PHP escapes the backslash

If you're having problems with unicode this SOEn response does it this way:

%pre%

You could still check the documentation of the library you're using to access the DB and look for some %code% method, or create it so you do not have to mess around to fix the PHP gambiarras.

    
03.12.2018 / 19:42