Pagina 1 din 1

filtrare array cu array cu obiecte

Scris: Dum Sep 08, 2019
de sterica
Salutare,

Am un array de forma:

Cod: Selectaţi tot

arr1 = ['tip1', 'tip2', 'tip3', 'tip4', 'tip5']
si un array de forma:

Cod: Selectaţi tot

arr2 = 
Array
(
[0] => stdClass Object
        (
            [denumireTip] => tip1
            [valoare] => 8
        )

    [1] => stdClass Object
        (
            [denumireTip] => tip3
            [valoare] => 14
        )

    [2] => stdClass Object
        (
            [denumireTip] => tip4
            [valoare] => 2
        )

)
Cum pot returna un array de obiecte de forma arr2 care sa contina toate denumirile de tip din arr1, iar unde nu sunt valori sa fie 0.
Multumesc!

filtrare array cu array cu obiecte

Scris: Dum Sep 08, 2019
de MarPlo
Salut,
Incearca functia setArOb() din urmatorul exemplu (acest exemplu functioneaza pe PHP 7.2+):

Cod: Selectaţi tot

$ar_t =['tip1', 'tip2', 'tip3', 'tip4', 'tip5'];
$ar_ob =[
 (object) array('denumireTip'=>'tip1', 'valoare'=>8),
 (object) array('denumireTip'=>'tip3', 'valoare'=>14),
 (object) array('denumireTip'=>'tip4', 'valoare'=>2)
];

function setArOb($ar_t, $ar_ob){
  $re =[];
  $n_t = count($ar_t);
  $n_ob = count($ar_ob);

  for($i=0; $i<$n_t; $i++){
    $add =0;
    for($i2=0; $i2<$n_ob; $i2++){
      if($ar_ob[$i2]->denumireTip ==$ar_t[$i]){
        $add =1;
        break;
      };
    }
    if($add ==0) $re[$i] =(object) array('denumireTip'=>$ar_t[$i], 'valoare'=>0);
    else $re[$i] = $ar_ob[$i2];
  }
  return $re;
}

$ar_fin = setArOb($ar_t, $ar_ob);

//Check
var_dump($ar_fin);

filtrare array cu array cu obiecte

Scris: Dum Sep 08, 2019
de sterica
pe server sun nevoit sa rulez 5.6, dar am laravel 5.4. O sa incerc cu collectiile laravel poate reusesc sa ii dau de cap.

filtrare array cu array cu obiecte

Scris: Dum Sep 08, 2019
de MarPlo
Pentru PHP 5.4+ incearca functia in varianta din urmatorul exemplu.

Cod: Selectaţi tot

// $ar_t - array simple [t1, t2, t3]
// $ar_ob - array of objects
function setArOb($ar_t, $ar_ob){
  $re =[];
  $n_t = count($ar_t);
  $n_ob = count($ar_ob);

  for($i=0; $i<$n_t; $i++){
    $add =0;
    for($i2=0; $i2<$n_ob; $i2++){
      if($ar_ob[$i2]->denumireTip ==$ar_t[$i]){
        $add =1;
        break;
      };
    }
    if($add ==0) $re[$i] =['denumireTip'=>$ar_t[$i], 'valoare'=>0];
    else $re[$i] = $ar_ob[$i2];
  }
  return json_decode(json_encode($re));
}

$ar_t =['tip1', 'tip2', 'tip3', 'tip4', 'tip5'];
$ar_ob =[
 ['denumireTip'=>'tip1', 'valoare'=>8],
 ['denumireTip'=>'tip3', 'valoare'=>14],
 ['denumireTip'=>'tip4', 'valoare'=>2]
];
$ar_ob = json_decode(json_encode($ar_ob));

$ar_fin = setArOb($ar_t, $ar_ob);

//Check
var_dump($ar_fin);

filtrare array cu array cu obiecte

Scris: Vin Sep 13, 2019
de sterica
Am gasit si o varianta cu unele laravel:

Cod: Selectaţi tot

$arr2 = collect($arr1)->map(function ($item) use($arr2) {
            $foo = collect($arr2)->first(function ($el) use($item) {
                return $el->denumireTip == $item;
                });
            if (!$foo) {
                return [denumireTip' => $item, 'valoare' => 0];
            }
            return $foo;
            });
Pentru cine foloseste un laravel de versiune mai noua, in loc de first se poate folosi find.