从数字最小

时间:2016-04-18 19:05:43

标签: php arrays

我很难搞清楚这个,情节是,有一个多维数组,其中有一个数组中的名称,id和数字,我想要的是获得具有相同数组的唯一数组名称不应该出现,这可以完成,我已经完成了,但我也希望返回的数组应该包含最低的数字,我希望这将有助于让你明白 我有

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

现在它是一个粗略的数组表示,我想要的是

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

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

我在使用什么:

code.php

<?php 
$details = array( 
0 => array("id"=>"1", "name"=>"Mike",    "num"=>"9876543210"), 
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'); 
?>

此函数返回

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

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

3 个答案:

答案 0 :(得分:3)

您可以使用array_reduce

$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 );

我们将每个数组元素与构造返回的数组进行比较(最初为空):如果在返回的数组中不存在key = $item['name']的项,我们将其添加;否则,如果当前项的num值低于相应的返回数组项,我们将此项替换为当前项。最后,我们使用array_values删除关联键。

结果:

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

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

)

答案 1 :(得分:0)

我会用两个循环来做这个

首先,按名称对数值进行分组,然后按数字

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

然后迭代结果,按键(num)排序名称,并将第一个元素追加到最终结果。

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

答案 2 :(得分:0)

我考虑过以下的例子。

<MenuItem Background="{x:Null}" Foreground="#FF706C6C" Command="{Binding ViewBugReportingCommand}" ToolTip="{StaticResource MenuItemToolTip}">
<MenuItem.Header>
    <Path Data="{StaticResource BugIconData}"
          Stretch="Uniform"
          Fill="#77000000"
          Width="20"
          RenderTransformOrigin="0.25,0.25"
          Height="20" />
</MenuItem.Header>

输出:

$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'); 

您可以根据需要使用任何排序函数对输出数组进行排序。