我的多维数组看起来像这样:
Array3: [
0 => array:2 [
model_id => 1
price => 2000
]
1 => array:2 [
model_id => 2
price => 3000
]
2 => array:2 [
model_id => 1
price => 1500
]
]
现在,我需要检查model_id的值是否出现多次,如果是,那么我需要在价格值较低的地方进行选择。在此示例中,我有两次model_id = 1,所以我应该选择第二个,因为价格最低。
我该怎么做?我尝试过这种方法:
how can I get the duplicate multidimensional array in php
PHP: Check for duplicate values in a multidimensional array
Finding Duplicate Values in Multi-dimensional Array
但是我仍然无法解决这个问题。结果数组应如下所示:
Array2: [
0 => array:2 [
model_id => 2
price => 3000
]
1 => array:2 [
model_id => 1
price => 1500
]
]
答案 0 :(得分:1)
简单的foreach
应该这样做:
foreach($arr as $e) {
if (isset($res[$e["model_id"]]))
$res[$e["model_id"]]["price"] = min($res[$e["model_id"]]["price"], $e["price"]);
else $res[$e["model_id"]] = $e;
}
答案 1 :(得分:1)
您可以利用关联数组键来实现唯一性并比较价格:
<?php
// Our data
$array = [
[ 'model_id' => 1, 'price' => 2000 ],
[ 'model_id' => 2, 'price' => 3000 ],
[ 'model_id' => 1, 'price' => 1500 ]
];
// Store the final result
$result = [];
// Loop the data
foreach( $array as $v )
{
// If this model_id has not been encountered or if the price is lower than what's stored then make it the new price
if( !isset( $output[ $v[ 'model_id' ] ] ) || $v[ 'price' ] < $output[ $v[ 'model_id' ] ][ 'price' ] )
{
$output[ $v[ 'model_id' ] ] = $v;
}
}
// Get rid of the unique keys
$output = array_values( $output );
print_r( $output );
输出:
Array
(
[0] => Array
(
[model_id] => 1
[price] => 1500
)
[1] => Array
(
[model_id] => 2
[price] => 3000
)
)
答案 2 :(得分:1)
您可以按price
降序排列,然后在model_id
上提取索引并建立索引,以便最后一个索引(每个price
索引的最低model_id
)将覆盖其他索引:< / p>
array_multisort(array_column($array, 'price'), SORT_DESC, $array);
$result = array_column($array, null, 'model_id');
答案 3 :(得分:0)
与使用model_id
函数相比,您可以按min
对它们进行分组
$groupByModelId = [];
foreach($a as $v){
$groupByModelId[$v['model_id']][] = $v['price'];
}
$searchModelId = 1;
echo min($groupByModelId[$searchModelId]);
答案 4 :(得分:0)
这是另一种方法,
function array_column1($input, $column_key = null, $index_key = null)
{
$result = [];
$i = 0;
foreach ($input as $v) {
$k = $index_key === null || !isset($v[$index_key]) ? $i++ : $v[$index_key];
// fetching all the values for model id
$result[$k][] = $column_key === null ? $v : (isset($v[$column_key]) ? $v[$column_key] : null);
}
// fetching minimum for every model_id
$result = array_map("min", $result);
return $result;
}
$temp = array_column1($arr, 'price', 'model_id');
Demo。
我从官方php doc使用了此功能。
答案 5 :(得分:0)
您可以使用usort数组函数获取第一个最小值记录,然后使用temp数组并运行foreach函数删除重复的记录。
下面的代码对我来说很好。
<?php
$arr = array(
[
'model_id' => 1,
'price' => 2000
],
[
'model_id' => 2,
'price' => 3000
],
[
'model_id' => 1,
'price' => 1500
]
);
usort($arr, function ($a, $b) {
return $a['price'] - $b['price'];
});
$input = $arr;
$temp = array();
$keys = array();
foreach ( $input as $key => $data ) {
unset($data['price']);
if ( !in_array($data, $temp) ) {
$temp[] = $data;
$keys[$key] = true;
}
}
$output = array_intersect_key($input, $keys);
print_r($output);