cmb Posted April 13, 2012 Share Posted April 13, 2012 this form i have takes some csv data and turns it into an array. For some reason the script inserts a blank key into the array and idk why. this is my script code: <?php if(isset($_POST['csv_btn'])){ $csv = $_POST['csv']; //turns csv into an array with each spot in the array a player and all data seperated by a comma $csv_mod = explode("Home,",$csv); $y = count($csv_mod) - 1; $x = 0; $team = array(); while ($x <= $y){ //takes the array from the csv explode and explodes each player and their data $tx = $csv_mod[$x]; $ex_tx = explode(",",$tx); $ex_tx_c = count($ex_tx); $z = 1; //is the players name $person = $ex_tx[0]; $person2 = $ex_tx[0]; //turn the player into an array $person = array(); //puts the players data into their array while ($z < $ex_tx_c){ array_push($person, $ex_tx[$z]); $z++; } //adds the player to the team array with their name being the index $team[$person2] = $person; $x++; } print_r($team); } ?> this is what i put into the script(exactly like this): Home,AJ,2,1,2,2,0,0,0,0,0,0,0,0 Home,Conner,0,0,2,2,0,0,0,0,0,0,0,0 Home,Joe,0,0,1,1,0,0,0,1,0,0,0,0 Home,Tyler,0,0,0,0,0,0,0,0,0,0,0,0 this is what it outputs: Array ( [] => Array ( ) [AJ] => Array ( [0] => 2 [1] => 1 [2] => 2 [3] => 2 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 ) [Conner] => Array ( [0] => 0 [1] => 0 [2] => 2 [3] => 2 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 ) [Joe] => Array ( [0] => 0 [1] => 0 [2] => 1 [3] => 1 [4] => 0 [5] => 0 [6] => 0 [7] => 1 [8] => 0 [9] => 0 [10] => 0 [11] => 0 ) [Tyler] => Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 ) ) Link to comment https://forums.phpfreaks.com/topic/260841-blank-array/ Share on other sites More sharing options...
xyph Posted April 13, 2012 Share Posted April 13, 2012 Use the built in CSV parser. <?php $str = 'Home,AJ,2,1,2,2,0,0,0,0,0,0,0,0 Home,Conner,0,0,2,2,0,0,0,0,0,0,0,0 Home,Joe,0,0,1,1,0,0,0,1,0,0,0,0 Home,Tyler,0,0,0,0,0,0,0,0,0,0,0,0'; $parts = explode( "\n", $str ); $parsed = array(); foreach( $parts as $part ) $parsed[] = str_getcsv($part); unset($parts); print_r($parsed); ?> Gives Array ( [0] => Array ( [0] => Home [1] => AJ [2] => 2 [3] => 1 [4] => 2 [5] => 2 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 [12] => 0 [13] => 0 ) [1] => Array ( [0] => Home [1] => Conner [2] => 0 [3] => 0 [4] => 2 [5] => 2 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 [12] => 0 [13] => 0 ) [2] => Array ( [0] => Home [1] => Joe [2] => 0 [3] => 0 [4] => 1 [5] => 1 [6] => 0 [7] => 0 [8] => 0 [9] => 1 [10] => 0 [11] => 0 [12] => 0 [13] => 0 ) [3] => Array ( [0] => Home [1] => Tyler [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 [12] => 0 [13] => 0 ) ) If you don't have str_getcsv on your server, you can use a UDF I made for this. <?php $csv = '1997,Ford,E350,"ac, abs, moon",3000.00 1999,Chevy,"Venture ""Extended Edition""","",4900.00 1999,Chevy,"Venture ""Extended Edition, Very Large""","",5000.00 1996,Jeep,Grand Cherokee,"MUST SELL! air, moon roof, loaded",4799.00'; // print_r( csv_explode($csv) ); print_r( csv_explode($csv) ); /** * * Covert a multi-line CSV string into a 2d array. Follows RFC 4180, allows * "cells with ""escaped delimiters""" and multi-line enclosed cells * It assumes the CSV file is properly formatted, and doesn't check for errors * in CSV format. * @param string $str The CSV string * @param string $d The delimiter between values * @param string $e The enclosing character * @param bool $crlf Return line breaks as CRLF * @return array */ function csv_explode( $str, $d=',', $e='"', $crlf=FALSE ) { // Convert CRLF to LF, easier to work with in regex $str = str_replace("\r\n","\n",$str); // Get rid of trailing linebreaks that RFC4180 allows $str = trim($str); // Do the dirty work if ( preg_match_all( '/(?: '.$e.'((?:[^'.$e.']|'.$e.$e.')*+)'.$e.'(?:'.$d.'|\n|$) # match enclose, then match either non-enclose or double-enclose # zero to infinity times (possesive), then match another enclose, # followed by a comma, linebreak, or string end | ####### OR ####### ([^'.$d.'\n]*+)(?:['.$d.'\n]|$) # match anything thats not a comma or linebreak zero to infinity # times (possesive), then match either a comma or a linebreak or # string end )/x', $str, $ms, PREG_SET_ORDER ) === FALSE ) return FALSE; // Initialize vars, $r will hold our return data, $i will track which line we're on $r = array(); $i = 0; // Loop through results foreach( $ms as $m ) { // If the first group of matches is empty, the cell has no quotes if( empty($m[1]) ) // Put the CRLF back in if needed $r[$i][] = isset($m[2]) ? $m[2] : ''; else { // The cell was quoted, so we want to convert any "" back to " and // any LF back to CRLF, if needed $r[$i][] = ($crlf == TRUE) ? str_replace( array("\n",$e.$e), array("\r\n",$e), $m[1]) : str_replace($e.$e, $e, $m[1]); } // If the raw match doesn't have a delimiter, it must be the last in the // row, so we increment our line count. if( substr($m[0],-1) != $d ) $i++; } // An empty array will exist due to $ being a zero-length match, so remove it array_pop( $r ); return $r; } ?> Returns Array ( [0] => Array ( [0] => 1997 [1] => Ford [2] => E350 [3] => ac, abs, moon [4] => 3000.00 ) [1] => Array ( [0] => 1999 [1] => Chevy [2] => Venture "Extended Edition" [3] => [4] => 4900.00 ) [2] => Array ( [0] => 1999 [1] => Chevy [2] => Venture "Extended Edition, Very Large" [3] => [4] => 5000.00 ) [3] => Array ( [0] => 1996 [1] => Jeep [2] => Grand Cherokee [3] => MUST SELL! air, moon roof, loaded [4] => 4799.00 ) ) Link to comment https://forums.phpfreaks.com/topic/260841-blank-array/#findComment-1336909 Share on other sites More sharing options...
MMDE Posted April 13, 2012 Share Posted April 13, 2012 Script: <?php $csv = 'Home,AJ,2,1,2,2,0,0,0,0,0,0,0,0 Home,Conner,0,0,2,2,0,0,0,0,0,0,0,0 Home,Joe,0,0,1,1,0,0,0,1,0,0,0,0 Home,Tyler,0,0,0,0,0,0,0,0,0,0,0,0'; $csv_mod = explode('Home,', $csv); $rows = count($csv_mod); for($i=0; $i<$rows; $i++){ $tmp = explode(',', $csv_mod[$i]); $tmp_rows = count($tmp); for($j=1; $j<$tmp_rows; $j++){ $csv_array[$tmp[0]][] = $tmp[$j]; } } print_r($csv_array); ?> Output: Array ( [AJ] => Array ( [0] => 2 [1] => 1 [2] => 2 [3] => 2 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 ) [Conner] => Array ( [0] => 0 [1] => 0 [2] => 2 [3] => 2 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 ) [Joe] => Array ( [0] => 0 [1] => 0 [2] => 1 [3] => 1 [4] => 0 [5] => 0 [6] => 0 [7] => 1 [8] => 0 [9] => 0 [10] => 0 [11] => 0 ) [Tyler] => Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 ) ) Link to comment https://forums.phpfreaks.com/topic/260841-blank-array/#findComment-1336911 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.