0

excuse me, I'm trying to create a function to copy the array, but the function does not work, please help. thanks before

<?php  
    function CopyState($from, $to){
        for($i=0; $i<9; $i++){
            $to[$i] = $from[$i];
        }
    }

    $a=array(1,2,3,4,5,6,7,8);
    CopyState($a,$b);

    echo $b[2];
?>

Edited by kazkuzzer007

3
Contributors
3
Replies
23
Views
2 Years
Discussion Span
Last Post by kazkuzzer007
0
<?php
// Array of a
$a = array("1" => 1, "2" => 4, "3" => 5, "4" => 10);

$aArrayObject = new ArrayObject($a);
$aArrayObject['pears'] = 4;

// create a copy of the array
$copy = $aArrayObject->getArrayCopy();
print_r($copy);

?>
0

In addition.

It does not work because $to exists only in the function scope and since you declare it as function argument $b, you should get PHP notices:

PHP Notice:  Undefined variable: b in line 9
PHP Notice:  Undefined variable: b in line 11

if you want to get the result you can do as suggested previously, basically:

$b = CopyState($a);

Or use references, i.e. function CopyState($from, &$to), documentation says:

If you assign, pass, or return an undefined variable by reference, it will get created.

So the second argument will be created during the execution of the function, example:

<?php

    $a = array(1,2,3,4,5,6,7,8,9);

    function CopyState($from, &$to)
    {
        return $to = $from;
    }

    CopyState($a, $b);

    print_r($b);

Which will return as expected, here's the documentation link:

Edited by cereal

0

ok thank you
The actual function I use to try to make the 8 puzzle solver using php by using code like this:

<?php  
    $GoalState = array(0,0,0,0,0,0,0,0,0);
    $CurrentState = array(0,0,0,0,0,0,0,0,0);
    $ChildState = array(0,0,0,0,0,0,0,0,0);

    function GetGoalState($initialstate, $goalstate){
        $total = 0;
        $GoalStateGanjil = array(1,2,3,8,0,4,7,6,5);
        $GoalStateGenap = array(0,1,2,3,4,5,6,7,8);

        for($i=0; $i<8; $i++){
            for($j=$i+1; $j<9; $j++){
                if($initialstate[$j] < $initialstate[$i] && $initialstate[$j] != 0)
                    $total = $total + 1;    
            }
        }

        if($total % 2 == 1){
            for($i=0; $i<9; $i++){
                $goalstate[$i] = $GoalStateGanjil[$i];
            }
        }else{
            for($i=0; $i<9; $i++){
                $goalstate[$i] = $GoalStateGenap[$i];
            }
        }
    }

    function PrintState($state){
        for($i=0; $i<9; $i++){
            if($i % 3 == 0)
                echo "<br>";

            echo " ".$state[$i];
        }
        echo "<br>";
    }

    function CopyState($from, $to){
        for($i=0; $i<9; $i++){
            $to[$i] = $from[$i];
        }
    }

    function SameState($currentstate, $goalstate){
        for($i=0; $i<9; $i++){
            if($currentstate[$i] != $goalstate[$i]){
                return false;
                break;
            }
        }
        return true;
    }

    function GetKotakKosong($state){
        $index = 0;

        for($i=0; $i<9; $i++){
            if($state[$i] == 0)
                $index = $i;
        }

        return $index;
    }

    function MoveUp($state){
        $index = GetKotakKosong(array(2,8,3,1,6,4,7,5,0));

        if($index > 2){     
            $state[$index] = $state[$index-3];
            $state[$index-3] = $state[$index-3] - $state[$index];
        }
    }

    function MoveDown($state){
        $index = GetKotakKosong(array(2,8,3,1,6,4,7,5,0));

        if($index < 6){
            $state[$index] = $state[$index+3];
            $state[$index+3] = $state[$index+3] - $state[$index];
        }
    }

    function MoveLeft($state){
        $index = GetKotakKosong(array(2,8,3,1,6,4,7,5,0));

        if($index % 3 > 0){
            $state[$index] = $state[$index-1];
            $state[$index-1] = $state[$index-1] - $state[$index];
        }
    }

    function MoveRight($state){
        $index = GetKotakKosong(array(2,8,3,1,6,4,7,5,0));

        if($index % 3 < 2){
            $state[$index] = $state[$index+1];
            $state[$index+1] = $state[$index+1] - $state[$index];
        }
    }

    function MatchTile($currentstate, $goalstate){
        $match = 0;

        for($i=0; $i<9; $i++){
            if($currentstate[$i] != 0 && $currentstate[$i] == $goalstate[$i])
                $match++;
        }

        return $match;
    }

    function GetTheBestMove($heuristic){
        $index = 0;
        $max = $heuristic[0];

        for($i=0; $i<4; $i++){
            if($heuristic[i] > $max){
                $max = $heuristic[$i];
                $index = $i;
            }
        }

        return $index;
    }


    $InitialState = array(2,8,3,1,6,4,7,5,0);

    GetGoalState($InitialState,$GoalState);
    echo "<br>Init State<br>----------";       
    PrintState($InitialState);
    echo "<br>Goal State<br>----------";
    PrintState($GoalState);
    echo "<br>Searching<br>---------";            
    CopyState($InitialState,$CurrentState);

    $level = 0;

    while(!SameState($CurrentState,$GoalState)){
        PrintState($CurrentState);
        $ChildState = array(2,8,3,1,6,4,7,0,5);

        $Heuristic = array(0,0,0,0);
        $level++;

        MoveUp(array(2,8,3,1,6,4,7,5,0));
        if(!SameState($ChildState,$CurrentState)){
            $Heuristic[0] = MatchTile($ChildState,$GoalState) + $level;
            MoveDown($ChildState);
        }

        MoveDown(array(2,8,3,1,6,4,7,5,0));
        if(!SameState($ChildState,$CurrentState)){
            $Heuristic[1] = MatchTile($ChildState,$GoalState) + $level;
            MoveUp($ChildState);
        }

        MoveLeft(array(2,8,3,1,6,4,7,5,0));
        if(!SameState($ChildState,$CurrentState)){
            $Heuristic[2] = MatchTile($ChildState,$GoalState) + $level;
            MoveRight($ChildState);
        }

        MoveRight(array(2,8,3,1,6,4,7,5,0));
        if(!SameState($ChildState,$CurrentState)){
            $Heuristic[3] = MatchTile($ChildState,$GoalState) + $level;
            MoveLeft($ChildState);
        }

        switch(GetTheBestMove($Heuristic)){
            case 0 : MoveUp($CurrentState); break;
            case 1 : MoveDown($CurrentState); break;
            case 2 : MoveLeft($CurrentState); break;
            case 3 : MoveRight($CurrentState); break;
        }       
    }



    echo "\n Solved with %i steps, %f seconds...".$level;
?>

The code I created from c ++ code like this:

#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int GoalState[9], CurrentState[9], ChildState[9] = {0,0,0,0,0,0,0,0,0};

void GetGoalState(int initialstate[], int goalstate[]){
    int i, j, total = 0;
    int GoalStateGanjil[] = {1,2,3,8,0,4,7,6,5};
    int GoalStateGenap[] = {0,1,2,3,4,5,6,7,8};

    for(i=0; i<8; i++){
        for(j=i+1; j<9; j++){
            if(initialstate[j] < initialstate[i] && initialstate[j] != 0)
                total = total + 1;  
        }
    }

    if(total % 2 == 1){
        for(i=0; i<9; i++){
            goalstate[i] = GoalStateGanjil[i];
        }
    }else{
        for(i=0; i<9; i++){
            goalstate[i] = GoalStateGenap[i];
        }
    }
}


void PrintState(int state[]){
    for(int i=0; i<9; i++){
        if(i % 3 == 0)
            cout << endl;

        cout << " " << state[i];
    }
    cout << endl;
}

void CopyState(int from[], int to[]){
    for(int i=0; i<9; i++){
        to[i] = from[i];
    }
}

bool SameState(int currentstate[], int goalstate[]){
    for(int i=0; i<9; i++){
        if(currentstate[i] != goalstate[i]){
            return false;
            break;
        }
    }
    return true;
}

int GetKotakKosong(int state[]){
    int index = 0;

    for(int i=0; i<9; i++){
        if(state[i] == 0)
            index = i;
    }

    return index;
}

void MoveUp(int state[]){
    int index = GetKotakKosong(state);

    if(index > 2){      
        state[index] = state[index-3];
        state[index-3] = state[index-3] - state[index];
    }
}

void MoveDown(int state[]){
    int index = GetKotakKosong(state);

    if(index < 6){
        state[index] = state[index+3];
        state[index+3] = state[index+3] - state[index];
    }
}

void MoveLeft(int state[]){
    int index = GetKotakKosong(state);

    if(index % 3 > 0){
        state[index] = state[index-1];
        state[index-1] = state[index-1] - state[index];
    }
}

void MoveRight(int state[]){
    int index = GetKotakKosong(state);

    if(index % 3 < 2){
        state[index] = state[index+1];
        state[index+1] = state[index+1] - state[index];
    }
}

int MatchTile(int currentstate[], int goalstate[]){
    int match = 0;

    for(int i=0; i<9; i++){
        if(currentstate[i] != 0 && currentstate[i] == goalstate[i])
            match++;
    }

    return match;
}

int GetTheBestMove(int heuristic[]){
    int index = 0;
    int max = heuristic[0];

    for(int i=0; i<4; i++){
        if(heuristic[i] > max){
            max = heuristic[i];
            index = i;
        }
    }

    return index;
}

int main(int argc, char** argv) {
    int InitialState[] = {2,8,3,1,6,4,7,0,5};

    GetGoalState(InitialState,GoalState);
    cout << "\nInit State\n" << "----------";        
    PrintState(InitialState);
    cout << "\nGoal State\n" << "----------";
    PrintState(GoalState);
    cout << "\nSearching\n" << "---------";         
    CopyState(InitialState,CurrentState);

    int level = 0;
    clock_t t;
    t = clock();

    while(!SameState(CurrentState,GoalState)){
        PrintState(CurrentState);
        CopyState(CurrentState,ChildState);

        int Heuristic[] = {0,0,0,0};
        level++;

        MoveUp(ChildState);
        if(!SameState(ChildState,CurrentState)){
            Heuristic[0] = MatchTile(ChildState,GoalState) + level;
            MoveDown(ChildState);
        }

        MoveDown(ChildState);
        if(!SameState(ChildState,CurrentState)){
            Heuristic[1] = MatchTile(ChildState,GoalState) + level;
            MoveUp(ChildState);
        }

        MoveLeft(ChildState);
        if(!SameState(ChildState,CurrentState)){
            Heuristic[2] = MatchTile(ChildState,GoalState) + level;
            MoveRight(ChildState);
        }

        MoveRight(ChildState);
        if(!SameState(ChildState,CurrentState)){
            Heuristic[3] = MatchTile(ChildState,GoalState) + level;
            MoveLeft(ChildState);
        }

        switch(GetTheBestMove(Heuristic)){
            case 0 : MoveUp(CurrentState); break;
            case 1 : MoveDown(CurrentState); break;
            case 2 : MoveLeft(CurrentState); break;
            case 3 : MoveRight(CurrentState); break;
        }       
    }

    PrintState(CurrentState);

    t = clock() - t;
    double time_taken = ((double)t)/CLOCKS_PER_SEC;

    printf("\n Solved with %i steps, %f seconds...",level,time_taken);
    getchar();
    return 0;
}

but, php program that I created was an error. I hope you can help me

Edited by kazkuzzer007

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.