Last active
August 29, 2015 14:01
-
-
Save petrowsky/e30130675e50cd8c066d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
$theArray = array ( | |
'Order_id' => 'mystore-12656', | |
'Currency' => 'USD', | |
'Time' => 'Fri Apr 6 10:46:57 2012 GMT', | |
'NumericTime' => '1390972125', | |
'IPAddress' => '127.0.0.1', | |
'Bill_First' => 'Tësting', | |
'Bill_Last' => 'Persøn', | |
'Bill_Company' => 'P&G', | |
'Bill_Address1' => '1234 Dürty Road', | |
'Bill_City' => 'Weiterstadt', | |
'Bill_State' => 'Stateville', | |
'Bill_Country' => 'DE Germany', | |
'Bill_Zip' => '92562', | |
'Bill_Phone' => '049615091854284', | |
'Bill_Email' => '[email protected]', | |
'Items' => array ( | |
'0' => array ( | |
'Id' => 'product-id', | |
'Code' => 'MAG001', | |
'Quantity' => '1', | |
'Unit_Price' => '34.95', | |
'Description' => 'ISO FileMaker Magazine', | |
'Url' => 'http://store.filemakertemplates.com/iso-mag.html', | |
'Taxable' => 'NO', | |
'Thumb' => '<img border=0 width=70 height=63 src=http://ep.yimg.com/ca/I/isoproductions_2194_963773>', | |
), | |
'1' => array ( | |
'Id' => 'videos-rapidramp', | |
'Code' => 'videos-rapidramp', | |
'Quantity' => '1', | |
'Unit_Price' => '178.00', | |
'Description' => 'Rapid Ramp Up Webinar', | |
'Url' => 'http://store.filemakertemplates.com/videos-rapidramp.html', | |
'Taxable' => 'NO', | |
'Thumb' => '<img border=0 width=70 height=63 src=http://ep.yimg.com/ca/I/isoproductions_2194_963773>', | |
), | |
'variable' => 'baz', | |
), | |
'Total' => array ( | |
'0' => array ( | |
'Line_type' => 'Total', | |
'Line_name' => 'Total', | |
'Line_notes' => '', | |
'Line_amount' => '24.95', | |
) | |
), | |
'Extra' => 'foobar' | |
); | |
// Adding another level for testing | |
$theArray['Items']['0']['level4'] = array('foo' => 'bar', 'baz' => 'boo'); | |
$desired = <<<EOT | |
\$Order_id = "mystore-12656";\$Currency = "USD";\$Time = "Fri Apr 6 10:46:57 2012 GMT";\$NumericTime = "1390972125";\$IPAddress = "127.0.0.1";\$Bill_First = "Tësting";\$Bill_Last = "Persøn";\$Bill_Company = "P&G";\$Bill_Address1 = "1234 Dürty Road";\$Bill_City = "Weiterstadt";\$Bill_State = "Stateville";\$Bill_Country = "DE Germany";\$Bill_Zip = "92562";\$Bill_Phone = "049615091854284";\$Bill_Email = "[email protected]";\$Extra = "foobar"; | |
\$Items = "\$0 = \"___Insert > [Items][0]___\";¶\$1 = \"___Insert > [Items][1]___\";¶\$variable = \"baz\";"; | |
\$Total = "\$0=\"___Insert > [Total][0]___\";"; | |
EOT; | |
/* | |
FileMaker quote level examples | |
2 "\"foo\"" | |
3 "\"\\\"foo\\\"\"" | |
4 "\"\\\"\\\\\\\"foo\\\\\\\"\\\"\"" | |
5 "\"\\\"\\\\\\\"\\\\\\\\\\\\\\\"foo\\\\\\\\\\\\\\\"\\\\\\\"\\\"\"" | |
Let ( | |
~var = Quote ( "foo" ); | |
List ( | |
"2 " & Quote ( ~var ); | |
"3 " & Quote ( Quote ( ~var ) ); | |
"4 " & Quote ( Quote ( Quote ( ~var ) ) ); | |
"5 " & Quote ( Quote ( Quote ( Quote ( ~var ) ) ) ); | |
) | |
) | |
*/ | |
print '<pre>'; | |
print "----------------------------------\nOriginal Array\n----------------------------------\n"; | |
print_r($theArray); | |
print "----------------------------------\nThe Objective (see comments)\n----------------------------------\n"; | |
// At each level of an array, a return should be injected so it can be walked with a FileMaker Loop step. | |
// Because FileMaker does not support multidimensional arrays, <cr>'s must be insterted and converted to ¶ | |
print $desired . "\n"; | |
print "----------------------------------\nCurrent state of conversion\n----------------------------------\n"; | |
$compressed =fmLet($theArray, 'Order'); | |
foreach ($compressed['Order'] as $key => $value) { | |
if ($key === 'fmpVars') { | |
$string = $value; | |
} else { | |
$string .= "\n" . $value['fmpVars']; | |
} | |
} | |
print_r($compressed); | |
// This is the string you pass into a FileMaker script for parsing | |
print "<h2>Final result string</h2>\n\n"; | |
print fmQuote($string); | |
print "\n\n</pre>\n\n"; | |
function fmLet($arr, $container = 'Main', &$result = array()) { | |
static $level = 1, $parent = ''; | |
foreach($arr as $key => $value) { | |
// print $level . "\n"; | |
if (is_array($value)) { | |
print "[$container] at level $level with key $key\n"; | |
$level++; | |
// $result .= '' | |
$parent = $container; | |
fmLet($value, $key, $result[$container]); // passing the result array as reference for pointer | |
$level--; | |
continue; | |
} | |
print "[$container] at level $level with key $key\n"; | |
// Append the variable string in quoted fmp format | |
$varstring .= '$' . $key . ' = ' . fmQuote($value) . ';'; | |
// Inject into tree array | |
$result[$container]['fmpVars'] = $varstring; | |
// print $level . "\n"; | |
} | |
print "\n------------- FUNCTION RESULT -------------\n"; | |
if ($parent === $container) { | |
print "\n\n>>>>>>>>>>>>>>I SHOULD COMPRESS HERE\n\n"; | |
} | |
print "Parent container is $parent\n"; | |
print "Current container is $container\n"; | |
print "Level is $level\n"; | |
print "Count of result is " . count($result) . "\n"; | |
print "Result array is\n"; | |
print_r($result[$parent]) . "\n"; | |
// Collect fmpVars when at matching level of entry | |
if ($parent === $container) { | |
// Remove the fmpVars because $varstring has it and we don't want to count it | |
unset($result[$parent]['fmpVars']); | |
foreach ($result[$parent] as $value) { | |
$varstring .= (empty($varstring)) ? $value['fmpVars'] : "\n" . $value['fmpVars']; | |
} | |
} | |
// Inject into wrapper | |
$wrapper = '$' . $container . ' = «INSERT»;'; | |
$wrapper = str_replace('«INSERT»', fmQuote($varstring), $wrapper); | |
print $wrapper . "\n"; | |
print "\n------------- FUNCTION END -------------\n"; | |
// Append to container | |
$result[$container]['fmpVars'] = $wrapper; | |
return $result; | |
} | |
/* | |
* Helper function to fix quotes for FMP compatibility | |
*/ | |
function fmQuote ($value) { | |
return '"' . str_replace(array('\\', '"', '¶', "\n"), array('\\\\', '\"', '\\¶', '¶'), $value) . '"'; | |
} | |
?> | |
<hr/> | |
<h2>FileMaker script to parse variables.</h2> | |
<pre> | |
# Name: Loopit ( variables ) | |
#---------------------------------- | |
# Capture parameters | |
#---------------------------------- | |
If [ not #Assign ( #Filter ( | |
Get ( ScriptParameter ) ; | |
ScriptRequiredParameterList ( "" ) | |
))] | |
Show Custom Dialog [ Title: "Developer Error!"; Message: Quote ( Get ( ScriptName ) ) & " could not process the required variables."; Default Button: “Darn”, Commit: “Yes” ] | |
Exit Script [ ] | |
End If | |
#---------------------------------- | |
# Walk variables list | |
#---------------------------------- | |
Set Variable [ $itemCount; Value:ValueCount ( $variables ) ] | |
Loop | |
Exit Loop If [ Let ( $i = $i + 1 ; If ( $i > Int ( $itemCount ) ; Let ( $i = "" ; True ) ) ) ] | |
Set Variable [ $~line; Value:GetValue ( $variables ; $i ) ] | |
Set Variable [ $~lineIsContainer; Value:GetAsBoolean ( PatternCount ( $~line ; ";\¶" ) ) or | |
GetAsBoolean ( PatternCount ( $~line ; " = \\\"$" ) ) ] | |
Set Variable [ $~lineHasEmbeddedVars; Value:GetAsBoolean ( PatternCount ( $~line ; "= \\\"" ) ) ] Set Variable [ $~varsCreated; Value:#Assign ( $~line ) ] | |
Set Variable [ $~package; Value:"$" & LeftWords ($~line ; 1 ) ] | |
If [ $~lineIsContainer ] | |
Perform Script [ “Loopit ( variables )”; Parameter: # ( "variables" ; Evaluate ( $~package ) ) ] | |
End If | |
If [ $~lineHasEmbeddedVars ] | |
Set Variable [ $~varsExplodedOut; Value:#Assign ( Evaluate ( $~package ) ) ] | |
End If | |
End Loop | |
</pre> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment