簡體   English   中英

獲取未定義:使用排序算法偏移錯誤消息

[英]Getting Undefined:Offset error messages with Sorting Algorithm

因此,當我運行此代碼時,我遇到了很多這些錯誤。 我即將放棄,只使用PHP中的排序功能。 但如果有人能在這里看到問題我會很高興。 請看下面的代碼。 如果難以閱讀,請提前抱歉。

數組輸入很好,因為print_r輸出完全符合預期,但無論我嘗試什么,實際的排序算法都無法正常工作。 底部的兩個評論函數用於不同的試驗。

<?php
//this function will pull a string from a txt file and pass characters to an array
function strToArray($file){
    if ($handle = fopen($file, 'r')){
        $string = fread($handle, filesize($file)); 
        fclose($handle);
    }
    $strArray = str_split(preg_replace('/\s+/', '', $string)); //regex in preg_replace gets rid of all whitespaces; str_split converts string to array
    $arrLen = array_count_values($strArray); 
    return $arrLen;
}

$arrayWithVal = strToArray("filetest.txt"); //intermediary to pass into next function
print_r($arrayWithVal); //see what I have so far
echo "<hr />";

$newArray = $arrayWithVal;
for ($i = 1; $i < count($newArray); $i++){
    for ($j = $i-1; $j >= 0; $j--){

        if ($newArray[$j] > $newArray[$j+1]){ //if value on left is bigger than current value
            $oldValue = $newArray[$j+1];
            $newArray[$j+1] = $newArray[$j];
            $newArray[$j] = $oldValue;
            //return $newArray;
        }
        else {
            break; //if value on left is smaller, skip to next position
        }
    }            
}


print_r($newArray); //END

/*
function insertionSort($array){
    $newArray=$arrayWithVal;
    for($j=1; $j < count($newArray); $j++){  
        $temp = $newArray[$j];  
        $i = $j;  
        while(($i >= 0) && ($newArray[$i-1] > $temp)){  
            $newArray[$i] = $newArray[$i-1];  
            $i--;  
        }  
        $newArray[$i] = $temp;  
    }  
    return $array;
}
*/
/*
function insertionSort($arrData){
    for ($i=1;$i<count($arrData);$i++){
        for ($j=$i-1;$j>=0;$j--){

            if ($arrData[$j]>$arrData[$j+1]){ //if value on left is bigger than current value
                $oldValue = $arrData[$j+1];
                $arrData[$j+1] = $arrData[$j];
                $arrData[$j] = $oldValue;
            }
            else {
                break; //if value on left is smaller, skip to next position
            }
        }            
     }
     return $arrData;
}
*/
?>

編輯:我還應該提到,在它返回錯誤后,它會輸出與第一個print_r輸出相同的數組。

您正在使用array_count_values($strArray)函數,它將使用$strArray的值作為鍵返回一個數組,並將它們在$strArray的頻率作為值返回。

所以對於ex: $arrayWithVal將是:

array('some_word'=>3,'other_word'=>4);

您正在將此數組復制到$newArray ,然后您嘗試使用數字索引訪問$newArray$newArray[$j+1]$newArray是一個關聯數組。

這就是為什么你得到未定義的偏移誤差。

您問題的確切工作代碼可以是:

//this function will pull a string from a txt file and pass characters to an array
function strToArray($file){
    if ($handle = fopen($file, 'r')){
        $string = fread($handle, filesize($file)); 
        fclose($handle);
    }
    $strArray = str_split(preg_replace('/\s+/', '', $string)); //regex in preg_replace gets rid of all whitespaces; str_split converts string to array
    $arrLen = array_count_values($strArray); 
    return $arrLen;
}

$arrayWithVal = strToArray("filetest.txt"); //intermediary to pass into next function
print_r($arrayWithVal); //see what I have so far

$newArray = $arrayWithVal;

$test = array();
foreach($newArray as $v){
    $test[] = $v;
}
for ($i = 1; $i < count($test); $i++){
    for ($j = $i-1; $j >= 0; $j--){

        if ($test[$j] > $test[$j+1]){ //if value on left is bigger than current value
            $oldValue = $test[$j+1];
            $test[$j+1] = $test[$j];
            $test[$j] = $oldValue;
            //return $newArray;
        }
        else {
            break; //if value on left is smaller, skip to next position
        }
    }            
}
$result = array();
foreach($test as $k => $v){
    $keys_array = array_keys($newArray, $v);
    foreach($keys_array as $key){
        $result[$key] = $v;
    }
}

print_r($result);// to see $result array

如果你的$newArray是:

Array
(
    [some] => 4
    [r] => 3
    [w] => 6
    [t] => 1
    [a] => 8
    [hell] => 4
)

$result數組將是:

Array
(
    [t] => 1
    [r] => 3
    [some] => 4
    [hell] => 4
    [w] => 6
    [a] => 8
)

如果你正在學習PHP,它的好方法,但你應該只使用inbuild php函數以獲得更好的時間性能。

我希望它有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM