Php关联数组排序并获取最长的密钥

时间:2016-03-19 12:31:06

标签: php arrays sorting associative

嘿,我有一个关联数组,其键为String,值为Int。 所以从那个关联数组我需要得到具有最高值的键,如果多个键具有相同的值,那么我需要具有最高长度的键。

那么最有效的方法是什么?

例如

float matchresult = 1;
p_capWebcam = cvCaptureFromCAM(0);
cvNamedWindow("Original", CV_WINDOW_AUTOSIZE);
if (p_capWebcam != NULL)
{
    while (true)
    {
        IplImage *frame = cvQueryFrame(p_capWebcam);
        cvShowImage("WEBCAM_TEST", frame);
        cvWaitKey(20);
    }
}
else
{
    std::cout << "CAMERA NOT DETECTED" << std::endl;
}

IplImage * tableauxImage[6];

for (int i = 0; i<6; i++)
{
    tableauxImage[i] = cvLoadImage(alphabetTable[i], CV_LOAD_IMAGE_GRAYSCALE);
}

while (1){

    p_imgOriginal = cvQueryFrame(p_capWebcam);
    p_gray = cvCreateImage(cvGetSize(p_imgOriginal), 8, 1);
    cvFlip(p_imgOriginal, p_imgOriginal, 1);
    cvCvtColor(p_imgOriginal, p_gray, CV_BGR2GRAY);
    cvSetImageROI(p_gray, cvRect(100, 100, 200, 200));
    cvThreshold(p_gray, p_gray, 100, 255, CV_THRESH_BINARY_INV);
    MainWindow::draw_box(p_imgOriginal, cvRect(100, 100, 200, 200));

    // when show Roi Button is clicked
    if (showGray == true) {
        cvNamedWindow("template gray", CV_WINDOW_AUTOSIZE);
        cvShowImage("template gray", p_gray);
    }

    cvShowImage("Original", p_imgOriginal);
    for (int i = 0; i<6; i++){
        if (startmatching == true)
            matchresult = MainWindow::match_two_shapes(tableauxImage[i], p_gray);

        if (matchresult<0.1){
            ui->signname->setText(QString(convertstring(alphabetTable[i])[0])); //good match
            timer1->start(1000);
        }

        else {
            if (matchresult<0.25)
                color = cvScalar(0x00, 0xff, 0x00);
            else
                color = cvScalar(0x00, 0x00, 0xff);
        }
        ui->matchresultlabel->setText(QString::number(matchresult));
    }
    charCheckForEscKey = cvWaitKey(ui->Delais->value());// delay (in ms), and get key press, if any
    if ((charCheckForEscKey == 27) || (stopCapture))
        break;
}

for (int i = 0; i < 6; i++)
{
    cvReleaseImage(&tableauxImage[i]);
}
cvReleaseCapture(&p_capWebcam);
cvDestroyAllWindows();

因此,我应该将输出作为adsfefs

3 个答案:

答案 0 :(得分:4)

您可以使用array_keys并传递第二个参数来过滤返回的密钥,仅包含max个密钥。然后,您可以使用array_reduce和一个检查字符串长度并抛出最短字符串的函数找到最长的密钥,如下所示:

$array = array(
    'abc'     => 10,
    'def'     => 8,
    'fff'     => 3,
    'abcr'    => 10,
    'adsfefs' => 10
);

$keys = array_keys($array, max($array));
$longestKey = array_reduce($keys, function ($a, $b) { return strlen($a) > strlen($b) ? $a : $b; });

var_dump($longestKey);

请注意,如果有两个或更多相同长度的字符串,则会返回最后一个字符串。

答案 1 :(得分:0)

  1. 使用arsort(array)按价值对其进行反向排序
  2. 只要值不变,
  3. foreach结果数组。将每个密钥以格式

    存储在其他数组中
    [key] => strlen(key);
    
  4. 所以arsort(other_array)并取第一个元素。它应该是具有最长键的键(但要注意,如果有许多键具有相同的长度,则应添加一些其他条件以在它们之间进行选择)。

    <?php
    
    $sid = array(
        'abc'     => 10,
        'def'     => 8,
        'fff'     => 3,
        'abcr'    => 10,
        'adsfefs' => 10
    );
    
    arsort($sid);
    
    $prev_val = null;
    $keys = Array();
    
    foreach ($sid as $k=>$v) {
        if ($k < $prev_val) break;
        $keys[$k] = strlen($k);
        $prev_val = $k;
    }
    
    
    arsort($keys);
    
    echo "Longest key with highest value is: " . array_keys($keys)[0] . "\n";
    ?>
    

答案 2 :(得分:0)

使用arsort($data);执行值数据的初始排序,然后使用array_values标识最大值。使用最大值查找哪些键具有此值,然后迭代并找到最长的键值。

$data = array('bob' => 3, 'rob' => 4, 'nigel' => 6,'john' => 6, 'tony' => 6 );

// Sort array in descending value order
arsort($data);

// Get the first value (will be the largest value)
$maxValue = array_values($data)[0];

// Get an array of all keys with this value
$keys = array_keys($data, $maxValue);

// Find longest key
$maxKey = '';
foreach ($keys as $key) {
    if (strlen($key) > strlen($maxKey)) {
        $maxKey = $key;
    }
}

// Output
print "Largest Value = $maxValue\n";
print "Largest Key with value of $maxValue is $maxKey\n";