2012-01-30 3 views
0

пусть говорят, у меня есть массив этих значений:Как сделать PHP значение массива равны друг другу быстрее

$arr = array(190, 2215, 2, 61); 

после того как я запускаю мой код с 694 петлями, я получил это конечные значения:

Array 
(
    [0] => 696 
    [1] => 696 
    [2] => 696 
    [3] => 696 
) 

Как я могу сделать процесс быстрее и намного лучше? Я могу увеличить или уменьшить значение на 1

Ниже приведены мои коды.

<?php 
    echo '<pre>'; 
    $arr = array(190, 2215, 2, 61); 
    sort($arr); 
    print_r($arr); 

    $arrLength = count($arr); 
    $counter = 0; 

    loop: 
    $counter++; 

    for($i=0; $i<$arrLength; $i++){ 
     if($arr[$i] < $arr[$arrLength-1] && $arr[$arrLength-1] != $arr[$arrLength-2]) { 
      $arr[$i]++; 
      $arr[$arrLength-1]--; 
     }else if($arr[$i] < $arr[$arrLength-1] && $arr[$arrLength-1] == $arr[$arrLength-2]) { 
      $arr[$i]++; 
     } 
    } 

    if($arr[0] != $arr[$arrLength-1]) goto loop; 

    print_r($arr); 
    print_r($counter); 
?> 
+0

Звучит как [тег: домашнее задание]. Это? Если это так, вы получите более полезные ответы, если пометить их как таковые. – ghoti

+5

Увидев «goto» вместо очень очевидного заявления «do ... while», я очень боюсь спросить: «Что в мире вы пытаетесь достичь? –

+0

@ Kolink: Performance, duh, все знают, что «goto» получает гораздо больше времени за такое короткое время: P – BoltClock

ответ

3

Вашего код просто находит взвешенное среднее между двумя наибольшими значениями в массиве, а затем устанавливает все к нему (Второму по величине элемент имеет вес number of elements - 1, наибольший элемент имеет вес 1). Вы можете сделать это намного легче и быстрее, как это:

<?php 
    echo '<pre>'; 
    $arr = array(190, 2215, 2, 61); 
    sort($arr); 
    print_r($arr); 

    $arrLength = count($arr); 

    // Find weighted average of second largest element and largest element in array: 
    $avg = floor(($arr[$arrLength - 2] * ($arrLength - 1) + $arr[$arrLength - 1])/$arrLength); 

    // Only need this line if you need the end value of counter from your code 
    // $counter = $avg - $arr[0]; // (964 in this example) 
    $arr = array_fill(0, $arrLength, $avg); 

    print_r($arr); 

?> 

Примечание: если все, что вам нужно, это число (696), то вам не нужно array_fill линии. Просто используйте переменную $avg для того, что вам понадобится позже.

+0

+1 OP требует 'O (n^2)', это 'O (1)', не может быть проще. – nickb

+0

@ PaulP.R.O. спасибо за код, но как мне действительно нужно увеличить или уменьшить каждое значение массива на 1, чтобы получить номер (696)? – skycrew

+0

@skycrew Я не уверен, что вы имеете в виду. Если вы можете уменьшить или увеличить только на 1, используйте цикл. Но таким образом вы можете получить тот же результат без цикла. Если вам нужно знать, сколько итераций ваш код сделал бы, то раскомментируйте строку '$ counter = $ avg - $ arr [0];'. Затем вы можете добавить 'print_r ($ counter);' до конца, чтобы получить тот же результат, что и ваш код выше, без цикла. – Paulpro

Смежные вопросы