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
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
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
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
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