次のような数値の配列があります。
$array = array(1,1,1,4,3,1);
最も繰り返される値の数を取得するにはどうすればよいですか?
これはうまくいくはずです:
$count=array_count_values($array);//Counts the values in the array, returns associatve array
arsort($count);//Sort it from highest to lowest
$keys=array_keys($count);//Split the array so we can find the most occuring key
echo "The most occuring value is $keys[0][1] with $keys[0][0] occurences."
array_count_values 関数が役立つと思います。詳細については、このマニュアルを参照してください: http://php.net/manual/en/function.array-count-values.php
次のようにして、配列内の値の出現回数をカウントできますarray_count_values
。
$counts = array_count_values($array);
次に、カウントに対して逆ソートを実行します。
arsort($counts);
次に、一番上の値をチェックしてモードを取得します。
$mode = key($counts);
配列に文字列または整数のみが含まれている場合は、array_count_values
andのみを使用できarsort
ます。
$array = array(1, 1, 1, 4, 3, 1);
$counts = array_count_values($array);
arsort($counts);
これにより、最も使用される要素が の最初の要素として残され$counts
ます。後でカウント量と値を取得できます。
元の配列に同じ数の要素が複数ある場合、どれが得られるかはわかりません。array_count_values
すべてはとの実装に依存しarsort
ます。特定のバグが必要な場合は、後でバグを防ぐためにこれを徹底的にテストする必要があります。仮定はしないでください。
特定のものが必要な場合はarsort
、リダクション ループを使用せずに自分で作成する方がよいでしょう。
$array = array(1, 1, 1, 4, 3, 1);
/* Our return values, with some useless defaults */
$max = 0;
$max_item = $array[0];
$counts = array_count_values($array);
foreach ($counts as $value => $amount) {
if ($amount > $max) {
$max = $amount;
$max_item = $value;
}
}
foreach ループの後、見つかった順序で要素$max_item
を返す限り、元の配列に最も多く現れる最後のアイテムが含まれarray_count_values
ます (ドキュメントの例に基づいてケースのように見えます)。非厳密な比較 ($amount >= $max
の代わりに$amount > $max
) を使用して、元の配列で最初の項目を最も多く表示することができます。
この方法で、すべての要素を最大数の出現に関連付けることもできます。
$array = array(1, 1, 1, 4, 3, 1);
/* Our return values */
$max = 0;
$max_items = array();
$counts = array_count_values($array);
foreach ($counts as $value => $amount) {
if ($amount > $max) {
$max = $amount;
$max_items = array($value);
} elif ($amount = $max) {
$max_items[] = $value;
}
}
$vals = array_count_values($arr);
asort($vals);
//you may need this end($vals);
echo key($vals);
asort がデフォルトで asc または desc をソートするかどうかは覚えていません。コード内のコメントを確認できます。
<?php
$arrrand = '$arr = array(';
for ($i = 0; $i < 100000; $i++)
{
$arrrand .= rand(0, 1000) . ',';
}
$arrrand = substr($arrrand, 0, -1);
$arrrand .= ');';
eval($arrrand);
$start1 = microtime();
$count = array_count_values($arr);
$end1 = microtime();
echo $end1 - $start1;
echo '<br>';
$start2 = microtime();
$tmparr = array();
foreach ($arr as $key => $value);
{
if (isset($tmparr[$value]))
{
$tmparr[$value]++;
} else
{
$tmparr[$value] = 1;
}
}
$end2 = microtime();
echo $end2 - $start2;
ここでは、両方のソリューションを確認してください: 1array_count_values()
つずつ、1 つは手動で。
$arrays = array(1, 2, 2, 2, 3, 1); // sample array
$count=array_count_values($arrays); // getting repeated value with count
asort($count); // sorting array
$key=key($count);
echo $arrays[$key]; // get most repeated value from array
ここに解決策があります
クラスTestClass {
public $keyVal;
public $keyPlace = 0;
//put your code here
public function maxused_num($array) {
$temp = array();
$tempval = array();
$r = 0;
for ($i = 0; $i <= count($array) - 1; $i++) {
$r = 0;
for ($j = 0; $j <= count($array) - 1; $j++) {
if ($array[$i] == $array[$j]) {
$r = $r + 1;
}
}
$tempval[$i] = $r;
$temp[$i] = $array[$i];
}
//fetch max value
$max = 0;
for ($i = 0; $i <= count($tempval) - 1; $i++) {
if ($tempval[$i] > $max) {
$max = $tempval[$i];
}
}
//get value
for ($i = 0; $i <= count($tempval) - 1; $i++) {
if ($tempval[$i] == $max) {
$this->keyVal = $tempval[$i];
$this->keyPlace = $i;
break;
}
}
// 1.place holder on array $this->keyPlace;
// 2.number of reapeats $this->keyVal;
return $array[$this->keyPlace];
}
}
$catch = 新しい TestClass(); $array = array(1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 1, 2, 3, 1, 1, 2 、5、7、1、9、0、11、22、1、1、22、22、35、66、1、1、1); echo $catch->maxused_num($array);