0

I am generating a multidimensional array which outputs in the following format:

Array
(
    [0] => Array
        (
            [cName] => "Club Name (Exp. Date)"
            [location] => ""
            [days_times] => '0'
            [zip] => 0
            [state] => 0
            [contact_person] => ""
            [contact_phone] => '0'
        )

)



Array
(
    [0] => Array
        (
            [cName] => "Club Name (Exp. Date)"
            [location] => ""
            [days_times] => '0'
            [zip] => 0
            [state] => 0
            [contact_person] => ""
            [contact_phone] => '0'
        )

)

I need it to output in the following format Each new record with a unique key:

Array
(
    [0] => Array
        (
            [cName] => "Club Name (Exp. Date)"
            [location] => ""
            [days_times] => '0'
            [zip] => 0
            [state] => 0
            [contact_person] => ""
            [contact_phone] => '0'
        )

    [1] => Array
        (
            [cName] => "Club Name (Exp. Date)"
            [location] => ""
            [days_times] => '0'
            [zip] => 0
            [state] => 0
            [contact_person] => "Contacts"
            [contact_phone] => '0'
        )

)

I am using the code below to build the array.

foreach ($xpath->query('//table[@id="tblClubs"]/tr') as $node) {
    $rowData = array();
    foreach ($xpath->query('td', $node) as $cell) {
        $rowData[] = "\"$cell->nodeValue\"";
   }

    $data[] = $rowData;

$array_two = array();
$arrayIndex=0;
$loopCount=0;
$second_index="";
foreach ($rowData as $myValue) {
$loopCount = ($loopCount<5) ? $loopCount : 0;
switch ($loopCount) {

case '0':
$second_index="cName";
break;

case '1':
$second_index="location";
break;

case '2':
$second_index="contact_person";
break;

}
$array_two[$arrayIndex][$second_index]=$myValue;


 if($loopCount == 1)
    {
    //escape single quote in location information
            $locale=str_replace("'", "\'", $myValue);
            $array_two[$arrayIndex]['location'] = $locale;


    //get playing days
        if(preg_match("/?!\d[0-9]{4}/", $myValue, $match) == 1)
        {
        $array_two[$arrayIndex]['days_times'] = "'$match[0]'";
        }
        else
        {
        $array_two[$arrayIndex]['days_times'] = "'0'";
        }

    //get zip
        $pattern = '#([A-Z]{0})\s+(\d{5})#s';
        if(preg_match($pattern, $myValue, $match) == 1)
        {
        $array_two[$arrayIndex]['zip'] = trim($match[0]);//"'$match[0]'";

        }
        else
        {
        $array_two[$arrayIndex]['zip'] = 0;
        }

        //get state
        if(preg_match("/[A-Z]{2}(?=[\s]{1,}[0-9]{5})/", $myValue, $match) == 1)
        {
        $array_two[$arrayIndex]['state'] = "'$match[0]'";
        }
        else
        {
        $array_two[$arrayIndex]['state'] = '0';
        }


    }

    //get contact phone number
 if($loopCount == 2)
    {

            if(preg_match('/\(?[2-9][0-8][0-9]\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}/', $myValue, $match) == 1)
            {
            $array_two[$arrayIndex]['contact_phone'] = "'$match[0]'";
            }
            else
            {
            $array_two[$arrayIndex]['contact_phone'] = "'0'";
            }

            //remove phone and leave contact name

            $newContact=preg_replace('/\(?[2-9][0-8][0-9]\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}/','',$myValue);

            $array_two[$arrayIndex]['contact_person'] = $newContact;


}

$arrayIndex = ($loopCount>=4) ? $arrayIndex+1 : $arrayIndex;
$loopCount++;
}

}

May I ask for some assistance in direct me to where in the code needing modification for the desired output format.

I appreciate any thoughts on this.

Edited by mbarandao

2
Contributors
7
Replies
52
Views
3 Years
Discussion Span
Last Post by mbarandao
0

Hi Mossa,

Your code is clearly not a million miles away from doing what you want.

I think it would benefit from :

  • Rearranging to do more inside the switch/case structure
  • Having $loopCount as a simple incremental
  • Judicious use of the % operator to work out whether or not we are at the start of a new set of five
  • Explicitly creating a new inner array at the start of each new set.

Addressing all the above, I end up with the following, though I'm not sure it will cure the problem :

foreach ($xpath->query('//table[@id="tblClubs"]/tr') as $node) {
    $rowData = array();
    foreach ($xpath->query('td', $node) as $cell) {
        $rowData[] = "\"$cell->nodeValue\"";
    }
    $data[] = $rowData;//??
    $array_two = array();
    $arrayIndex = 0;
    $loopCount = 0;
    foreach ($rowData as $myValue) {
        switch ($loopCount % 5) {
            case 0:
                $array_two[$arrayIndex] = array();//explicitly create an 'inner' array
                $array_two[$arrayIndex]['cName'] = $myValue;
            break;
            case 1:
                // $array_two[$arrayIndex]['location'] = $myValue;
                //escape single quote in location information
                $locale = str_replace("'", "\'", $myValue);
                $array_two[$arrayIndex]['location'] = $locale;
                //get playing days
                if(preg_match("/?!\d[0-9]{4}/", $myValue, $match) == 1) {
                    $array_two[$arrayIndex]['days_times'] = "'$match[0]'";
                } else {
                    $array_two[$arrayIndex]['days_times'] = "'0'";
                }
                //get zip
                $pattern = '#([A-Z]{0})\s+(\d{5})#s';
                if(preg_match($pattern, $myValue, $match) == 1) {
                    $array_two[$arrayIndex]['zip'] = trim($match[0]);//"'$match[0]'";
                } else {
                    $array_two[$arrayIndex]['zip'] = 0;
                }
                //get state
                if(preg_match("/[A-Z]{2}(?=[\s]{1,}[0-9]{5})/", $myValue, $match) == 1) {
                    $array_two[$arrayIndex]['state'] = "'$match[0]'";
                } else {
                    $array_two[$arrayIndex]['state'] = '0';
                }
            break;
            case 2:
                $array_two[$arrayIndex]['contact_person'] = $myValue;
                //get contact phone number
                if(preg_match('/\(?[2-9][0-8][0-9]\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}/', $myValue, $match) == 1) {
                    $array_two[$arrayIndex]['contact_phone'] = "'$match[0]'";
                } else {
                    $array_two[$arrayIndex]['contact_phone'] = "'0'";
                }
                //remove phone and leave contact name
                $newContact = preg_replace('/\(?[2-9][0-8][0-9]\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}/','',$myValue);
                $array_two[$arrayIndex]['contact_person'] = $newContact;
            break;
        }
        $loopCount++;//simple increment
        $arrayIndex = (($loopCount % 5) == 0) ? $arrayIndex + 1 : $arrayIndex;//when appropriate, increment $arrayIndex ready for start of next set of five
    }
}
0

Hi Airshow,

I appreciate your thoughts and the structing of the code.

It appears that I'm still not able to get the intended array format. Not sure where the issue lies.

still looking...

0

Looking at it again, you probably need to declare the main array before the outer foreach() loop, and populate it inside the loop.

If I'm right, then the switch/case structure can also disappear, as follows :

$arr = array();
foreach ($xpath->query('//table[@id="tblClubs"]/tr') as $node) {
    $rowData = array();
    foreach ($xpath->query('td', $node) as $cell) {
        $rowData[] = "\"$cell->nodeValue\"";
    }

    $i = $arr.push(array()) - 1;

    //From cell 0
    $arr[$i]['cName'] = $rowData[0];

    //From cell 1
    //escape single quote in location information
    $arr[$i]['location'] = str_replace("'", "\'", $rowData[1]);
    //get playing days
    if(preg_match("/?!\d[0-9]{4}/", $rowData[1], $match) == 1) {
        $arr[$i]['days_times'] = "'$match[0]'";
    } else {
        $arr[$i]['days_times'] = "'0'";
    }
    //get zip
    $pattern = '#([A-Z]{0})\s+(\d{5})#s';
    if(preg_match($pattern, $rowData[1], $match) == 1) {
        $arr[$i]['zip'] = trim($match[0]);//"'$match[0]'";
    } else {
        $arr[$i]['zip'] = 0;
    }
    //get state
    if(preg_match("/[A-Z]{2}(?=[\s]{1,}[0-9]{5})/", $rowData[1], $match) == 1) {
        $arr[$i]['state'] = "'$match[0]'";
    } else {
        $arr[$i]['state'] = '0';
    }

    //From cell 2
    $arr[$i]['contact_person'] = $rowData[2];
    //get contact phone number
    if(preg_match('/\(?[2-9][0-8][0-9]\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}/', $rowData[2], $match) == 1) {
        $arr[$i]['contact_phone'] = "'$match[0]'";
    } else {
        $arr[$i]['contact_phone'] = "'0'";
    }
    //remove phone and leave contact name
    $arr[$i]['contact_person'] = preg_replace('/\(?[2-9][0-8][0-9]\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}/','',$rowData[2]);
}

Edited by Airshow

0

an error is thrown:

Fatal error: Call to undefined function push() in /home5/tablete7/public_html/spinsoftonline/hhhhhdh.php on line 48
1

Sorry, that's javascript!

try $i = array_push($arr, array()) - 1;.

Edited by Airshow

0

Airshow,

That did the job!

I am able to format the array accordingly...Thank you very much!

Best,
Mossa

This question has already been answered. 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.