сортировать 2d массив на основе другого массива - PullRequest
0 голосов
/ 01 марта 2012

у меня есть 1D массив A и 2D массивB.

arrayA[0] = 'D'
arrayA[1] = 'U'
arrayA[3] = 'R'
arrayA[4] = 'B'
arrayA[5] = 'S'
arrayA[6] = 'H'

arrayB[0][0] = 'D'   arrayB[0][1] = 2   
arrayB[1][0] = 'B'   arrayB[1][1] = 1
arrayB[2][0] = 'R'   arrayB[2][1] = 1
arrayB[3][0] = 'U'   arrayB[3][1] = 1
arrayB[4][0] = 'H'   arrayB[4][1] = 0
arrayB[5][0] = 'S'   arrayB[5][1] = 0

Массив B [x] [y] отсортирован - на основе y.

Я должен создать новый массив, используя буквы, сначала отдавая приоритет y из массива B [x] [y]. Но в y есть несколько одинаковых значений: 1 три раза и 0 два раза. В этой ситуации аналогичные значения будут отсортированы в соответствии с массивом A.

и новый массив будет сортироваться как:

D, U, R, B, S, H

Как я могу сделать это эффективно?

заранее спасибо

Ответы [ 2 ]

0 голосов
/ 01 марта 2012

В приведенном ниже коде $string соответствует arrayB[x][0], $weight соответствует arrayB[x][1] и $order соответствует arrayA:

<?php

$string = str_split('DBRUHS');
$weight = str_split('211100');
$result = '';

function my_sort($a, $b)
{
    $order = str_split('DURBSH');
    $a = array_search($a, $order);
    $b = array_search($b, $order);
    if ($a === $b) return 0;
    if ($a === FALSE) return -1;
    if ($b === FALSE) return 1;
    if ($a == $b) return 0;
    return ($a < $b) ? -1 : 1;
}

arsort($weight);
$current_priority = -1;
$substring = array();
$max = count($weight);
$count = 1;
foreach ($weight as $position => $priority)
{
    if ($count++ == $max)
    {
        $substring[] .= $string[$position];
        $priority = $current_priority + 1;
    }
    if ($current_priority != $priority)
    {
        if (!empty($substring))
        {
            usort($substring, 'my_sort');
            $result .= implode('', $substring);
        }
        $current_priority = $priority;
        $substring = array($string[$position]);
    }
    else
    {
        $substring[] = $string[$position];
    }
}

print_r(str_split($result));

?>
0 голосов
/ 01 марта 2012

Я попробовал это, и все работало нормально.a1 - это массив 1d, a2 - это 2d.

EDIT: Теперь это работает.

function sortArr($a1, $a2) {
    $t1 = array();

    foreach ($a1 as $v) {
        $t2 = array();
        foreach ($a2 as $i=>$k) {
            if ($k[0] == $v) {
                $t2[0] = $k[0];
                $t2[1] = $k[1];
                $t1[$i] = $t2;
                break;
            }
        }
    }

    return $t1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...