count la elemente in array multidimenional

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Avatar utilizator
trif
Mesaje: 501

count la elemente in array multidimenional

Buna ziua,
Am o problema si nu stiu cum sa o rezolv.
Am un array multidimensional si nu stiu cum sa fac count pe o anumita ramura.
Ex.:

Cod: Selectaţi tot

array (size=1)
  38 => 
    array (size=4)
      '' => 
        array (size=1)
          '' => 
            array (size=2)
              833 => 
                array (size=8)
                  'idP' => string '38' (length=2)
                  'denumireP' => string 'p 01-1111222' (length=15)
                  'idO' => null
                  'denumireO' => null
                  'idC' => null
                  'denumireC' => null
                  'idS' => string '833' (length=3)
                  'denumireS' => string 's1' (length=19)
              880 => 
                array (size=8)
                  'idP' => string '38' (length=2)
                  'denumireP' => string 'p 01-1111222' (length=15)
                  'idO' => null
                  'denumireO' => null
                  'idC' => null
                  'denumireC' => null
                  'idS' => string '880' (length=3)
                  'denumireS' => string 's2' (length=7)
      4 => 
        array (size=3)
          3 => 
            array (size=1)
              813 => 
                array (size=8)
                  'idP' => string '38' (length=2)
                  'denumireP' => string 'p 01-1111222' (length=15)
                  'idO' => string '4' (length=1)
                  'denumireO' => string '1/1112' (length=6)
                  'idC' => string '3' (length=1)
                  'denumireC' => string 'testpath1' (length=9)
                  'idS' => string '813' (length=3)
                  'denumireS' => string 's12' (length=16)
          4 => 
            array (size=1)
              160 => 
                array (size=8)
                  'idP' => string '38' (length=2)
                  'denumireP' => string 'p 01-1111222' (length=15)
                  'idO' => string '4' (length=1)
                  'denumireO' => string '1/1112' (length=6)
                  'idC' => string '4' (length=1)
                  'denumireC' => string 'C1234' (length=5)
                  'idS' => string '160' (length=3)
                  'denumireS' => string 'a22' (length=25)
          5 => 
            array (size=1)
              812 => 
                array (size=8)
                  'idP' => string '38' (length=2)
                  'denumireP' => string 'p 01-1111222' (length=15)
                  'idO' => string '4' (length=1)
                  'denumireO' => string '1/1112' (length=6)
                  'idC' => string '5' (length=1)
                  'denumireC' => string 'q1' (length=2)
                  'idS' => string '812' (length=3)
                  'denumireS' => string 's22' (length=16)
      5 => 
        array (size=3)
          1 => 
            array (size=1)
              159 => 
                array (size=8)
                  'idP' => string '38' (length=2)
                  'denumireP' => string 'p 01-1111222' (length=15)
                  'idO' => string '5' (length=1)
                  'denumireO' => string '2/1112' (length=6)
                  'idC' => string '1' (length=1)
                  'denumireC' => string 'test1' (length=5)
                  'idS' => string '159' (length=3)
                  'denumireS' => string 'ss11' (length=25)
          4 => 
            array (size=2)
              814 => 
                array (size=8)
                  'idP' => string '38' (length=2)
                  'denumireP' => string 'p 01-1111222' (length=15)
                  'idO' => string '5' (length=1)
                  'denumireO' => string '2/1112' (length=6)
                  'idC' => string '4' (length=1)
                  'denumireC' => string 'C1234' (length=5)
                  'idS' => string '814' (length=3)
                  'denumireS' => string 'sa11' (length=16)
              816 => 
                array (size=8)
                  'idP' => string '38' (length=2)
                  'denumireP' => string 'p 01-1111222' (length=15)
                  'idO' => string '5' (length=1)
                  'denumireO' => string '2/1112' (length=6)
                  'idC' => string '4' (length=1)
                  'denumireC' => string 'C1234' (length=5)
                  'idS' => string '816' (length=3)
                  'denumireS' => string '121ss' (length=16)
          5 => 
            array (size=1)
              828 => 
                array (size=8)
                  'idP' => string '38' (length=2)
                  'denumireP' => string 'p 01-1111222' (length=15)
                  'idO' => string '5' (length=1)
                  'denumireO' => string '2/1112' (length=6)
                  'idC' => string '5' (length=1)
                  'denumireC' => string 'q1' (length=2)
                  'idS' => string '828' (length=3)
                  'denumireS' => string '221' (length=20)
      6 => 
        array (size=1)
          3 => 
            array (size=1)
              831 => 
                array (size=8)
                  'idP' => string '38' (length=2)
                  'denumireP' => string 'p 01-1111222' (length=15)
                  'idO' => string '6' (length=1)
                  'denumireO' => string '3/1112' (length=6)
                  'idC' => string '3' (length=1)
                  'denumireC' => string 'testpath1' (length=9)
                  'idS' => string '831' (length=3)
                  'denumireS' => string 'asda11' (length=25)
Am facut asa

Cod: Selectaţi tot

$or[$p][$o][$c][$s]['idp']=$row_result['id_p'];
$or[$p][$o][$c][$s]['denumirep']=$row_result['denumire_p'];

$or[$p][$o][$c][$s]['ido']=$row_result['id_o'];
$or[$p][$o][$c][$s]['denumireo']=$row_result['do'];

$or[$p][$o][$c][$s]['idCotatie']=$row_result['id_c'];
$or[$p][$o][$c][$s]['denumireCotatie']=$row_result['denumire_c'];

$or[$p][$o][$c][$s]['ids']=$row_result['id_s'];
$or[$p][$o][$c][$s]['denumires']=$row_result['denumire_s'];
Si apoi foreach

Cod: Selectaţi tot

 foreach ($or as $p) {
                foreach ($p as $o){
                    foreach ($o as $c){
                        foreach ($c as $s)
                       
Ceea ce vreau este ca sa fac count pe fiecare ramura.
Am facut un tabel html cu datele din select dar doresc sa scriu cu rowspan in locurile unde este nevoie.

Sper ca am explicat cat de bine.
Daca aveti intrebari si rezolvari le astept.

Astept raspuns.
Multumesc anticipat.
Cu stima Trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo
La ce vrei sa faci count, ce elemente din acel array sa numerotezi? Cate sub-array ar fiecare array sau cum?
Daca se poate, sa dai un exemplu ce sa rezulte; si sa pui array-ul asa cum e in php, sau cum rezulta cu functia var_export($array); ca sa poata fi testat.

trif
Buna ziua,
am dat var_export si mi-a dat asta

Cod: Selectaţi tot

  array (
  ),
  38 => 
  array (
    'nivel1' => 'nivel 01-2014',
    'id_nivel' => '38',
    '' => 
    array (
      'nivel2' => NULL,
      'id_nivel2' => NULL,
      '' => 
      array (
        'nivel3' => NULL,
        'id_nivel3' => NULL,
        382 => 
        array (
          'nivel4' => 's2',
          'id_nivel4' => '382',
        ),
        545 => 
        array (
          'nivel4' => 's32',
          'id_nivel4' => '545',
        ),
        811 => 
        array (
          'nivel4' => 's11',
          'id_nivel4' => '811',
        ),
        815 => 
        array (
          'nivel4' => '1ss',
          'id_nivel4' => '815',
        ),
        833 => 
        array (
          'nivel4' => '3321',
          'id_nivel4' => '833',
        ),
        840 => 
        array (
          'nivel4' => 'adsada',
          'id_nivel4' => '840',
        ),
        880 => 
        array (
          'nivel4' => 'sC123_1',
          'id_nivel4' => '880',
        ),
      ),
      6 => 
      array (
        'nivel3' => 'Quote',
        'id_nivel3' => '6',
        888 => 
        array (
          'nivel4' => 'st_011111',
          'id_nivel4' => '888',
        ),
      ),
    ),
    0 => 
    array (
      'nivel2' => NULL,
      'id_nivel2' => '0',
      3 => 
      array (
        'nivel3' => 'testpath1',
        'id_nivel3' => '3',
        883 => 
        array (
          'nivel4' => '11211cc',
          'id_nivel4' => '883',
        ),
      ),
      4 => 
      array (
        'nivel3' => 'C1234',
        'id_nivel3' => '4',
        881 => 
        array (
          'nivel4' => 'sC123_2',
          'id_nivel4' => '881',
        ),
      ),
    ),
    4 => 
    array (
      'nivel2' => '1/2016',
      'id_nivel2' => '4',
      3 => 
      array (
        'nivel3' => 'testpath1',
        'id_nivel3' => '3',
        813 => 
        array (
          'nivel4' => 'asaaaa22',
          'id_nivel4' => '813',
        ),
      ),
      4 => 
      array (
        'nivel3' => 'C1234',
        'id_nivel3' => '4',
        160 => 
        array (
          'nivel4' => 'aa111ss',
          'id_nivel4' => '160',
        ),
      ),
    ),
    5 => 
    array (
      'nivel2' => '2/2016',
      'id_nivel2' => '5',
      4 => 
      array (
        'nivel3' => 'C1234',
        'id_nivel3' => '4',
        814 => 
        array (
          'nivel4' => 'aas22',
          'id_nivel4' => '814',
        ),
        816 => 
        array (
          'nivel4' => 'adasda11',
          'id_nivel4' => '816',
        ),
      ),
      5 => 
      array (
        'nivel3' => 'q1',
        'id_nivel3' => '5',
        828 => 
        array (
          'nivel4' => '11122',
          'id_nivel4' => '828',
        ),
      ),
    ),
    6 => 
    array (
      'nivel2' => '3/2016',
      'id_nivel2' => '6',
      3 => 
      array (
        'nivel3' => 'testpath1',
        'id_nivel3' => '3',
        831 => 
        array (
          'nivel4' => 'adssad112ss',
          'id_nivel4' => '831',
        ),
      ),
    ),
    8 => 
    array (
      'nivel2' => '5/2016',
      'id_nivel2' => '8',
      4 => 
      array (
        'nivel3' => 'C1234',
        'id_nivel3' => '4',
        882 => 
        array (
          'nivel4' => 'sC123_3',
          'id_nivel4' => '882',
        ),
      ),
    ),
    111 => 
    array (
      'nivel2' => NULL,
      'id_nivel2' => '111',
      3 => 
      array (
        'nivel3' => 'testpath1',
        'id_nivel3' => '3',
        884 => 
        array (
          'nivel4' => 'saa',
          'id_nivel4' => '884',
        ),
        885 => 
        array (
          'nivel4' => 'as222',
          'id_nivel4' => '885',
        ),
        886 => 
        array (
          'nivel4' => 'adsa222',
          'id_nivel4' => '886',
        ),
      ),
    ),
  )
am 4 nivele de array (nivel1, nivel2, nivel3 si nivel4)
vreau ca sa fac rowspan si doresc sa stiu
1. nivelul 1 cate nivele are 4 in functie de nivelul 1;
2. nivelul 2 cate nivele are 4 in functie de nivelul 2;
3. nivelul 3 cate nivele are 4 in functie de nivelul 3.

tabelul ar trebui sa fie Imagine
am facut sa apara asa cum trebuie dar trebuie sa stiu rowspan-urile si counturile pe fiecare nivel.

Am mai incercat dar tot nu reusit.

Astept raspuns.

Cu stima Trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo
Vezi daca iti e de folos functia countKeys() din acest exemplu. Returneaza numarul de elemente cu o anume cheie din array-ul multidimensional transmis.
Cu ea poti numara de exemplu cate elemente 'nivel4' sunt in tot array-ul (sau cate cu 'nivel3').
Rezultatul dat de ea poti sa-l imparti sa calculezi cate "rowspan" vrei la fiecare nivel.

Cod: Selectaţi tot

// return the number or items with key of $key in $arr
function countKeys($arr, $key, $nr=0){
  if(is_array($arr)){
    foreach($arr AS $k=>$v){
      if(is_array($v)) $nr = countKeys($v, $key, $nr);
      else if($k == $key) $nr++;
    }
  }
  return $nr;
}

//multi-dimensional array
$arr =[
  0 =>[],
  38 =>[
    'nivel1' =>'nivel 01-2014',
    'id_nivel' =>'38',
    '' =>[
      'nivel2' =>NULL,
      'id_nivel2' =>NULL,
      '' =>[
        'nivel3' =>NULL,
        'id_nivel3' =>NULL,
        382 =>['nivel4' =>'s2', 'id_nivel4' =>'382'],
        545 =>['nivel4' =>'s32', 'id_nivel4' =>'545'],
        811 =>['nivel4' =>'s11', 'id_nivel4' =>'811'],
      ]
    ],
    0 =>[
      'nivel2' =>NULL,
      'id_nivel2' =>'0',
      3 =>[
        'nivel3' =>'testpath1',
        'id_nivel3' =>'3',
        883 =>['nivel4' =>'11211cc', 'id_nivel4' =>'883'],
      ],
      4 =>[
        'nivel3' =>'C1234',
        'id_nivel3' =>'4',
        881 =>['nivel4' =>'sC123_2', 'id_nivel4' =>'881']
      ]
    ]
  ]
];

//get number of keys 'nivel4' in $arr
$k_nvl4 = countKeys($arr, 'nivel4');
echo $k_nvl4;  // 5 

trif
Multumesc pentru raspuns.

merge pentru prima coloana dar dupaia la a doua coloana nu mai merge ca trebuie sa ii zic sa tina cont de colona 1 adica nivelul 1. pt ca nivelul 2 este de mai multe ori dar diferit in functie de nivelul1.

Asta cum as mai mutea sa o fac?

Cu stima Trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo
Nu stiu. Poate trebuie sa faci niste calcule aritmetice, adica la coloana 2 imparti numarul total la 2 (sau cat vrei).

trif
Multumesc pentru raspuns.
O sa vad eu ce fac.

Cu stima Trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

Subiecte similare