php-配列内の最小数を見つけて、その配列のプライマリインデックスを返す方法は?
次のような配列があります。 「diff」インデックスで番号が最も小さい配列を見つけたいのですが。したがって、この場合、配列[7]を取得したいと思います。必要なのはアレイ番号(つまり7)だけで、他の情報はありません。
array_columnを使用して最小の数値を簡単に見つけることができることはわかっていますが、配列全体のインデックスである7を返すにはどうすればよいですか?
[1] => Array
(
[qb] => 7
[rb] => 58
[wr] => 91
[te] => 3
[def] => 11
[diff] => 136
)
[2] => Array
(
[qb] => 21
[rb] => 96
[wr] => 102
[te] => 48
[def] => 15
[diff] => 240
)
[3] => Array
(
[qb] => 23
[rb] => 86
[wr] => 216
[te] => 6
[def] => 32
[diff] => 287
)
[4] => Array
(
[qb] => 30
[rb] => 51
[wr] => 200
[te] => 14
[def] => 17
[diff] => 266
)
[5] => Array
(
[qb] => 17
[rb] => 118
[wr] => 273
[te] => 14
[def] => 30
[diff] => 380
)
[6] => Array
(
[qb] => 10
[rb] => 112
[wr] => 142
[te] => 16
[def] => 4
[diff] => 264
)
[7] => Array
(
[qb] => 2
[rb] => 50
[wr] => 135
[te] => 9
[def] => 20
[diff] => 104
)
[8] => Array
(
[qb] => 16
[rb] => 68
[wr] => 141
[te] => 12
[def] => 1
[diff] => 224
)
答え :
解決策:
おっしゃるように、array_columnとmin()を使用できます。
次に、array_searchを使用して、最小値が存在する位置を見つけます。
//Since the array starts with key 1 then use array_values to reset the array first.
$array = array_values($array);
$diff = array_column($array, "diff");
$min = min($diff);
$key = array_search($min, $diff);
$result = $array[$key];
答え :
解決策:
ここに例があります。ループなしで解決策を実装しようとしましたが、成功しませんでした:
$diffs = array_column($array, 'diff'); // get all diffs
$key = min($diffs); // takes the smallest
$result = '';
foreach ($array as $subarray) {
if ($subarray['diff'] == $key) {
$result = $subarray;
}
}
var_dump($result);
$array
は配列です
戻る:
array(6) {
["qb"]=>
int(2)
["rb"]=>
int(50)
["wr"]=>
int(135)
["te"]=>
int(9)
["def"]=>
int(20)
["diff"]=>
int(104)
}
答え :
解決策:
ポットの別の解決策( PHP 7.3+ )。どれほど効率的かわかりません。
$diffs = array_column($array, "diff");
// lowest first sort (asort maintains correlation with original indices)
asort($diffs);
$lowest_dif_key = array_key_first($diffs) + 1; // requires PHP 7.3
// as array indices start at zero we have to add one for the correct "array key"
答え :
解決策:
1つの方法は、 uasort を使用してインデックスの関連付けを維持し、keyを使用して現在の配列位置のインデックスを返すことです。 。
uasort($arrays, function ($a, $b) {
return $a["diff"] > $b["diff"];
});
echo key($arrays); // 7
答え :
解決策:
最小の'diffが複数ある場合、問題が発生する可能性があります。 以下は配列をループし、元のキーとdiff値の間にマップを作成します。
次に、minを使用して最小のdiff値を見つけます。
次に、その値に対応するキーを検索します。そして、それらのキーで元の配列をフィルタリングします。
<?php
$data =
[
'five' => [
'diff'=>5
],
'three' => [
'diff'=>3
],
'seven' => [
'diff'=>3
]
];
foreach($data as $key => $value)
$diffs[$key] = $value['diff'];
$min_diff_keys = array_keys($diffs, min($diffs));
$output = array_intersect_key($data, array_flip($min_diff_keys));
var_export($output);
出力:
array (
'three' =>
array (
'diff' => 3,
),
'seven' =>
array (
'diff' => 3,
),
)
diffの一意の最小値が1つしかないことが確実な場合は、diffマップ($ diffs)でarray_keysの代わりにarray_searchを使用して、関連するキーをプルバックできます。そして、そのインデックスを使用して、目的のアレイをターゲットにします。
答え :
解決策:
この質問は、最小の差分の「タイ」を処理するのに十分な柔軟性があり、計算の複雑さが nである回答に値します。複数のループや複数の反復関数呼び出しを行う必要はありません。並べ替えの手法は、タイを無視します。
条件ブロックを含む単一のforeachループは、シンプルで効率的で、読みやすいです。
コード:(デモ)
$result = ['lowest' => null, 'indexes' => []];
foreach ($array as $index => $row) {
if ($result['lowest'] === null || $row['diff'] < $result['lowest']) {
$result['lowest'] = $row['diff']; // overwrite
$result['indexes'] = [$index]; // overwrite
} elseif ($row['diff'] == $result['lowest']) {
$result['indexes'][] = $index; // push
}
}
echo "First level index(es) with the lowest diff: " . implode(', ', $result['indexes']) . "\n";
echo "Lowest occurring diff in data set: " . $result['lowest'];
出力:
First level index(es) with the lowest diff: 7
Lowest occurring diff in data set: 104
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。