filtrare array cu array cu obiecte

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
sterica
Mesaje: 285

filtrare array cu array cu obiecte

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!

MarPlo Mesaje: 4343
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);

sterica Mesaje: 285
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.

MarPlo Mesaje: 4343
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);

sterica Mesaje: 285
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.

Subiecte similare