2016-04-18 2 views
-1

Ich habe Probleme beim Abrechnen, das Szenario ist, dass es ein mehrdimensionales Array gibt, in dem Name, ID und Nummer in einem Array, was ich will ist, um das einzigartige Array zu erhalten, in dem Array mit dem gleichen Namen nicht erscheinen sollte, dies kann getan werden, und ich hatte es getan, aber ich möchte auch, dass das Array, das zurückgegeben wird, sollte die niedrigste Zahl enthalten, ich hoffe, dies würde Ihnen helfen, zu verstehen ich habeHolen Sie sich das einzigartige Array von einem Array mit der niedrigsten Nummer

Array(
[0]=>array(
    [id]=>1 
    [name]=>abc 
    [num]=>4) 

[1]=> 
array(
    [id]=>2 
    [name]=>efg 
    [num]=>4) 

[2]=>array(
    [id]=>3 
    [name]=>abc 
    [num]=>2) 
) 

Nun ist es eine grobe Array-Darstellung, was ich von diesem will, ist

Array(
[0]=>array(
    [id]=>3 
    [name]=>abc 
    [num]=>2) 

[1]=> 
array(
    [id]=>2 
    [name]=>efg 
    [num]=>4) 

Was im mit:

code.php

<?php 
$details = array( 
0 => array("id"=>"1", "name"=>"Mike", "num"=>""), 
1 => array("id"=>"2", "name"=>"Carissa", "num"=>"08548596258"), 
2 => array("id"=>"1", "name"=>"Mathew", "num"=>"784581254"), 
); 

function unique_multidim_array($array, $key) { 
    $temp_array = array(); 
    $i = 0; 
    $key_array = array(); 

    foreach($array as $val) { 
     if (!in_array($val[$key], $key_array)) { 
     $key_array[$i] = $val[$key]; 
     $temp_array[$i] = $val; 
    } 
     $i++; 
} 
return $temp_array; 
} 
$details = unique_multidim_array($details,'name'); 
?> 

Diese Funktion gibt mir

Array(
[0]=>array(
    [id]=>1 
    [name]=>abc 
    [num]=4) 

[1]=> 
array(
    [id]=>2 
    [name]=>efg 
    [num]=>4) 
+0

Sie tun nie ein "dieses aktuelle Element kleiner ist als eine vorherige" -Vergleich . Sie durchlaufen einfach das Array und speichern den zuletzt gefundenen Schlüssel. –

+0

@mastermind, woher kommt '$ details' Array?es hat nicht die gleichen 'Namen' Tasten – RomanPerekhrest

+0

@MarcB ja ich weiß das und ich sagte es in meiner Antwort auch, dass ich nicht scheinen kann, dies herauszufinden .. –

Antwort

3

können Sie array_reduce verwenden:

$result = array_reduce 
(
    $array, 
    function($carry, $item) 
    { 
     if(!isset($carry[$item['name']]) || $item['num'] < $carry[$item['name']]['num']) 
     { 
      $carry[$item['name']] = $item; 
     } 
     return $carry; 
    }, 
    [] // This parameter (empty array) is optional in this case 
); 
$result = array_values($result); 

Wir vergleichen jedes Array-Element mit zurückgegebenen Array konstruieren (zunächst leer): Wenn in zurückgegebene Array nicht ein Element nicht existiert mit key = $item['name'], fügen wir es; Andernfalls, wenn der aktuelle Artikel num niedriger als der entsprechende zurückgegebene Array-Artikel ist, ersetzen wir diesen Artikel durch den aktuellen Artikel. Am Ende verwenden wir array_values, um assoziative Schlüssel zu entfernen.

Ergebnis:

Array 
(
    [0] => Array 
     (
      [id] => 3 
      [name] => abc 
      [num] => 2 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [name] => efg 
      [num] => 4 
     ) 

) 

+0

danke, dass funktioniert ... –

0

Ich würde dies namentlich die Werte

Zuerst Gruppe mit zwei Schleifen tun , dann Nummer

foreach ($your_array as $value) { 
    $names[$value['name']][$value['num']] = $value; 
} 

Dann iterieren Sie das Ergebnis davon, sortieren Sie den Namen nach Schlüssel (num) und hängen Sie das erste Element an das Endergebnis an.

foreach ($names as $set_of_nums) { 
    ksort($set_of_nums); 
    $result[] = reset($set_of_nums); 
} 
0

Ich habe das folgende Beispiel betrachtet.

$details = array( 
0 => array("id"=>"1", "name"=>"Mike", "num"=>"123"), 
1 => array("id"=>"2", "name"=>"Carissa", "num"=>"235"), 
2 => array("id"=>"3", "name"=>"Mike", "num"=>"5"), 
3 => array("id"=>"4", "name"=>"Tom", "num"=>"256"), 
4 => array("id"=>"5", "name"=>"Tom", "num"=>"500"), 
5 => array("id"=>"6", "name"=>"Mike", "num"=>"7"), 
); 

function unique_multidim_array($array, $key) { 
    $temp_array = array(); 
    $key_array = array(); 

    foreach($array as $k=>$val) { 
     if (!in_array($val[$key], $key_array)) { 
      // storing the array with the key 
      $key_array[$k] = $val[$key]; 
      $temp_array[$k] = $val; 
     } else{ 
      foreach($key_array as $r=>$p){ 
       //check for the array with the name 
       if($temp_array[$r]['name'] == $val['name']){ 
        // compare the value 
        if($temp_array[$r]['num']>$val['num']){ 
         // store the new array to the temp_array with same key of key_array 
         $temp_array[$r] = $val; 
        } 
       } 
      } 
     } 
    } 
    return $temp_array; 
} 
$details = unique_multidim_array($details,'name'); 

Ausgang:

Array 
(
[0] => Array 
    (
     [id] => 3 
     [name] => Mike 
     [num] => 5 
    ) 

[1] => Array 
    (
     [id] => 2 
     [name] => Carissa 
     [num] => 235 
    ) 

[3] => Array 
    (
     [id] => 4 
     [name] => Tom 
     [num] => 256 
    ) 

)

Sie können die Ausgabe-Array sortieren jede der Sortierfunktionen, wie Sie wünschen.

Verwandte Themen