Функция PHP (array_keys) не возвращает все индексы, кроме некоторых ключей цикла for - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь получить индексы (ключи) из несортированного массива, но что-то делаю не так. Это мои два массива:

$unsorted = [1,2,1,14,3,1,3,6,1,13,83,4, 4 ,68];
$sorted = [83,68,14,13,6,4,4,3,3,2,1,1,1,1];

Я попробовал array_keys(). Следующий код работает

$a = array_keys($unsorted,$sorted[0]);
print_r($a);
echo '<br>';

Выход

Array ([0] => 10)

но внутри цикла это не так. подскажите пожалуйста где я делаю не так

for($y=0;$y<sizeOf($sorted);$y++) {
    $final_keys = array_keys($unsorted,$sorted[$y]);
    //$final[] = $final_two[$y];
}
print_r($final_keys);

Выход

Массив ([0] => 0 [1] => 2 [2] => 5 [3] => 8)

я ожидаю

Array ([0] => 10 [1] => 13 [2] => 3 [3] => 9 [4] => 7 [5] => 11 [6] => 12 [7] => 4 [8] => 6 [9] => 1 [10] => 0 [11] => 2 [12] => 5 [13] => 8)

Ответы [ 5 ]

0 голосов
/ 26 октября 2018

Поскольку array_search - медленная операция, использование приводит к квадратичной сложности.Вместо этого вы можете использовать линейную сложность, сделав два прохода через массив.

$unsorted = [1,2,1,14,3,1,3,6,1,13,83,4, 4 ,68];
$sorted = [83,68,14,13,6,4,4,3,3,2,1,1,1,1];

$temp = [];
foreach($unsorted as $k=>$v) {
    $temp[$v][] = $k;
}

$res = [];
foreach($sorted as $v) {
    $res[] = array_shift($temp[$v]);
}

print_r($res);

demo

0 голосов
/ 26 октября 2018

Вы можете просто отсортировать ваш массив, сохраняя связь индекса, а затем получить ключи полученного массива:

$unsorted = [1,2,1,14,3,1,3,6,1,13,83,4, 4 ,68];
$temp = $unsorted; // create a copy, in case you need still need the unsorted version later on
arsort($temp); // sort values in reverse order, while keeping the keys
$keys = array_keys($temp);
var_dump($keys);
0 голосов
/ 26 октября 2018

Попробуйте это простое решение, используя array_search ()

$unsorted = [1,2,1,14,3,1,3,6,1,13,83,4, 4 ,68];
$sorted = [83,68,14,13,6,4,4,3,3,2,1,1,1,1];

foreach($sorted as $value) {
    $final_keys[] = $tempKey = array_search($value,$unsorted);
    unset($unsorted[$tempKey]);
}
print_r($final_keys);
0 голосов
/ 26 октября 2018

Loop $sorted, найдите пару ключ / значение в $unsorted и сохраните. И установите значение в $unsorted (я сделал копию, чтобы не уничтожать оригинал) в false, иначе 1 всегда найдет первое значение 1.

$unsorted = [1,2,1,14,3,1,3,6,1,13,83,4, 4 ,68];
$sorted = [83,68,14,13,6,4,4,3,3,2,1,1,1,1];
$copy = $unsorted;
$output=[];

foreach ($sorted as $key => $value){
  $reference = array_search( $value , $copy );
  $output[$key] = $reference;
  $copy[$reference] = false;
  }

Результат:

Array
(
    [0] => 10
    [1] => 13
    [2] => 3
    [3] => 9
    [4] => 7
    [5] => 11
    [6] => 12
    [7] => 4
    [8] => 6
    [9] => 1
    [10] => 0
    [11] => 2
    [12] => 5
    [13] => 8
)
0 голосов
/ 26 октября 2018

Вы не сохраняете вывод: $ final_keys - это обычная переменная, которая заполняется. или массив, пополняемый в его случае

$final_keys = array() ;
for($y=0;$y<sizeOf($sorted);$y++) {
$final_keys[] = array_keys($unsorted,$sorted[$y]);
//$final[] = $final_two[$y];
 }
print_r($final_keys);

Вы также можете добавить каждый массив к $final_keys правильному ключу:

$final_keys = array() ;
for($y=0;$y<sizeOf($sorted);$y++) {
$final_keys[$y] = array_keys($unsorted,$sorted[$y]);
//$final[] = $final_two[$y];
 }
print_r($final_keys);
...