2017-06-22 58 views
0

我有对象的数组作为检查是否存在键值中的任何对象的数组(对象数组)

$a = [{"id":"20","invoice_id":"123"},{"id":"21","invoice_id":"123"},{"id":"22","invoice_id":"125"},{"id":"23","invoice_id":"125"},{"id":"24","invoice_id":"123"}]; 

在这里,我想创建下贱的新数组,其中重复的对象不会在那里( invoice_id),因为新阵列将具有相同的第一个对象invoice_id。我是这样做的。

foreach ($a as $key => $value) { 
     if(isset($new)) { 
      foreach ($new as $k => $val) { 
       if($val->id != $value->id) { 
        $new[] = $value; 
       } 
      } 
     }else{ 
      $new[] = $value; 
     } 
    } 

我的新阵列将像

$new = [{"id":"20","invoice_id":"123"},{"id":"22","invoice_id":"125"}] 

,但它是不是给所需的输出。应该做什么 ?

+0

什么是'$ new'? – Nawin

+0

$ new将是新阵列 – JohnB

回答

3

既然您已将此标记为Laravel问题,请使用collections

较少的代码(一行!)和性能命中不存在。

$a = json_decode('[{"id":"20","invoice_id":"123"},{"id":"21","invoice_id":"123"},{"id":"22","invoice_id":"125"},{"id":"23","invoice_id":"125"},{"id":"24","invoice_id":"123"}]'); 

$result = collect($a)->groupBy('invoice_id'); 

后OP编辑问题:

$result = collect($a)->unique('invoice_id')->values()->toArray(); 

结果:

=> [ 
    {#826 
     +"id": "20", 
     +"invoice_id": "123", 
    }, 
    {#824 
     +"id": "22", 
     +"invoice_id": "125", 
    }, 
    ] 

,或者使用->toJson()代替->toArray()

"[{"id":"20","invoice_id":"123"},{"id":"22","invoice_id":"125"}]" 
+0

我不明白您的意见。 – Kyslik

+0

对不起,但这不是结果我desire.thanks – JohnB

+0

编辑后:使用' - > unique('invoice_id')'而不是'groupBy',你可以通过' - > toArray()将其转换为数组' – Kyslik

0
$result = []; 
foreach ($a as $data) { 
    $result[$data->id] = $data; 
} 

var_dump(array_values($results)); 
+0

它正在采取排或对象的最后ocuurence – JohnB

1

请尝试下面的代码用简单的逻辑,

$temp = $new = array(); 
$b = json_decode($a, true); 
foreach ($b as $key => $val) { 
    if(!in_array($val['invoice_id'], $temp)) { 
    $temp[$val['id']] = $val['invoice_id']; 
    $new[] = array('id' => $val['id'], 'invoice_id' => $val['invoice_id']); 
    } 
} 

print_r($new); 

我只是创建一个临时数组仅存储唯一INVOICE_ID在一个循环比较。

它给下面的结果,

Array 
(
    [0] => Array 
    (
     [id] => 20 
     [invoice_id] => 123 
    ) 

    [1] => Array 
    (
     [id] => 22 
     [invoice_id] => 125 
    ) 

) 
0

试试这个

$a = json_decode($a); 

$invoiceid = []; 
$unique = []; 
foreach ($a as $key => $value) { 
    if(!in_array($value->invoice_id,$invoiceid)) { 
     $invoiceid[] = $value->invoice_id; 
     $unique[] = $value; 
    } 

} 
    echo $a = json_encode($unique); 
相关问题