serializing an array and storing in DB - php
i have an array like
$newArray = $_POST[$newId];
print_r($newArray);
it prints like
Array ( [1] => Yes [2] => a [3] => b [4] => c [5] => d [6] => e [7] => f [8] => [9] => [10] => [11] => [12] => [13] => [14] => )
but when i try to store in in db after serializing like
serialize($newArray)
it get stored like
s:211:"Array
(
[1] => Yes
[2] => ab
[3] => c
[4] => d
[5] => e
[6] => f
[7] =>
[8] =>
[9] =>
[10] =>
[11] =>
[12] =>
[13] =>
[14] =>
)
";
which is a single array element in DB..how do i properly serialize the element.
It looks like it's serializing a string, not an array. Are you sure $newArray is an array?
The string returned from serialize starts with 's:211'. This means that a string was passed into serialize(). If an array were passed into serialize() the returned string would start with 'a:14'.
#pradeep
where you storing $newArray in textfield, store it by serialling
$arrayString = $_POST['newId'];
You will get seriallized array in $arrayString.
If you want to use that array before storing in database , use unserialize , else directly store in database as that is already seriallized.
$array = unserialize($arrayString);
This will solve your problem
Not really sure I understand the question, if you don't want to serialize though, and if you want to pass it from a text field, maybe do custom syntax like - 1:a;b:2;c:3
then explode(';',$string); loop that and for the result, explode(':',$rows)
make the delimiters more difficult to clash
explode("[[;]]", string); // 1]]:[[b[[;]]
Related
How do you inner join / merge two time series data arrays in PHP?
I want to join/combine two time series arrays into one single array where there are values for the same time stamp only. Each time series array looks like this $ARRAY1 = Array ( [1] => Array ( [0] => 1570572000 [1] => 1570485600 [2] => 1570399200 [3] => 1570140000 [4] => 1570053600 [5] => 1569967200 [6] => 1569880800 [7] => 1569794400 [8] => 1569535200 [9] => 1569448800 [10] => 1569362400 [11] => 1569276000 [12] => 1569189600 [13] => 1568930400 [14] => 1568844000 [15] => 1568757600 ) [2] => Array ( [0] => 0.7967851 [1] => -1.5081206 [2] => -0.4314591 [3] => 1.3359961 [4] => 0.8296883 [5] => -1.7323694 [6] => -1.1625164 [7] => 0.4908599 [8] => -0.5353535 [9] => -0.2083193 [10] => 0.5880961 and i have a similar one just with another set of data in the column and possibly different timestamps as well. In MYSQL i would just do an inner join. But in PHP if i had these two arrays $ARRAY1 and $ARRAY2 how do i merge them in to an array with three columns (column1 = timestamps, column2 = data1, column3 = data2) where i only include timestamps where both data1 and data2 are present? array_merge or array_combine or array_intersect are not doing this job. and i can only think of a crude method through a for loop and doing If timestamp1 = timestamp2 then update new array with data1 and data2. but surely there must be a more elegant way to solve this?
How to split 1 array into 2 arrays, remove certain items, and combine them again into 1 array in PHP?
i want to create something using array. I have 1 array and i need to split it into 2 array. After that search specific items from both array and remove it then combine it 2 array into 1 array. How do i do that? I already try to use unset for array but confuse how to use it for specific key since my array data format like 16/2/1/1 and 16/2/1/5. I need to remove data which have 1. My format array is like this Array ( [1] => Array ( [0] => 16/2/1/1 --> remove this have 1 after 2 [1] => 16/2/0/2 [2] => 16/2/0/3 [3] => 16/2/0/4 [4] => 16/2/0/5 [5] => 16/2/0/6 [6] => 16/2/0/7 [7] => 16/2/0/8 [8] => 16/2/0/9 [9] => 16/2/0/10 [10] => 16/2/0/11 [11] => 16/2/0/12 [12] => 16/2/0/13 [13] => 16/2/0/14 [14] => 16/2/0/15 [15] => 16/2/0/16 ) [2] => Array ( [0] => 16/2/0/1 [1] => 16/2/0/2 [2] => 16/2/0/3 [3] => 16/2/0/4 [4] => 16/2/1/5 --> and this have 1 after 2 before 5 [5] => 16/2/0/6 [6] => 16/2/0/7 [7] => 16/2/0/8 [8] => 16/2/0/9 [9] => 16/2/0/10 [10] => 16/2/0/11 [11] => 16/2/0/12 [12] => 16/2/0/13 [13] => 16/2/0/14 [14] => 16/2/0/15 [15] => 16/2/0/16 ) ) i expect the output something like (after combine) Array ( [0] => 16/2/0/2 [1] => 16/2/0/3 [2] => 16/2/0/4 [3] => 16/2/0/6 [4] => 16/2/0/7 [5] => 16/2/0/8 [6] => 16/2/0/9 [7] => 16/2/0/10 [8] => 16/2/0/11 [9] => 16/2/0/12 [10] => 16/2/0/13 [11] => 16/2/0/14 [12] => 16/2/0/15 [13] => 16/2/0/16 ) Thanks for time to help me.
Make the array unique and then extract items that are digits/digits/NOT 1/digits: $array = preg_grep('#^\d+/\d+/[^1]/\d+#', array_unique($array));
I would use preg_grep which allows you to search an array using a Regular expression. $array =[ '16/2/0/13', '16/2/0/16', '16/2/1/5' ]; $array = preg_grep('~^16/2/0/\d+$~', $array); print_r($array); Output Array ( [0] => 16/2/0/13 [1] => 16/2/0/16 ) Sandbox The Regex ^ match start of string 16/2/0/ - match literally (at the start of string, see above) \d+ any digit one or more $ match end of string So Regular expressions is a way to do pattern matching, in this case the pattern is 16/2/0/{n} where {n} is any number. So by doing this we can find only those items that match that pattern. Then if you have duplicates, you can do array_unique() and easily remove those. There are many ways to do this array_filter with a custom callback etc. But this is the most straightforward way (if you know Regex).
How can I put strings in array starting from 0 index
hello I have a string like this "*HQ,6170929875,V1,185905,A,3127.3354,N,07307.6954,E,000.09,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185915,A,3127.3365,N,07307.6951,E,002.30,018,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185925,A,3127.3372,N,07307.6952,E,000.76,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185935,A,3127.3369,N,07307.6947,E,000.27,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185945,A,3127.3371,N,07307.6951,E,000.27,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185955,A,3127.3377,N,07307.6952,E,000.21,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190005,A,3127.3376,N,07307.6950,E,000.17,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190015,A,3127.3376,N,07307.6953,E,000.07,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190025,A,3127.3375,N,07307.6955,E,000.59,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190035,A,3127.3373,N,07307.6944,E,000.35,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190045,A,3127.3378,N,07307.6950,E,000.23,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190055,A,3127.3381,N,07307.6955,E,000.32,000,060718,FFFFB9FF,410,04,03104,32566#" I want to put all these values in an array. so I did this $array = explode("*",$str); Now when i printed the array the data is Array ( [0] => [1] => HQ,6170929875,V1,185905,A,3127.3354,N,07307.6954,E,000.09,000,060718,FFFFB9FF,410,04,03104,32566# [2] => HQ,6170929875,V1,185915,A,3127.3365,N,07307.6951,E,002.30,018,060718,FFFFB9FF,410,04,03104,32566# [3] => HQ,6170929875,V1,185925,A,3127.3372,N,07307.6952,E,000.76,000,060718,FFFFB9FF,410,04,03104,32566# [4] => HQ,6170929875,V1,185935,A,3127.3369,N,07307.6947,E,000.27,000,060718,FFFFB9FF,410,04,03104,32566# [5] => HQ,6170929875,V1,185945,A,3127.3371,N,07307.6951,E,000.27,000,060718,FFFFB9FF,410,04,03104,32566# [6] => HQ,6170929875,V1,185955,A,3127.3377,N,07307.6952,E,000.21,000,060718,FFFFB9FF,410,04,03104,32566# [7] => HQ,6170929875,V1,190005,A,3127.3376,N,07307.6950,E,000.17,000,060718,FFFFB9FF,410,04,03104,32566# [8] => HQ,6170929875,V1,190015,A,3127.3376,N,07307.6953,E,000.07,000,060718,FFFFB9FF,410,04,03104,32566# [9] => HQ,6170929875,V1,190025,A,3127.3375,N,07307.6955,E,000.59,000,060718,FFFFB9FF,410,04,03104,32566# [10] => HQ,6170929875,V1,190035,A,3127.3373,N,07307.6944,E,000.35,000,060718,FFFFB9FF,410,04,03104,32566# [11] => HQ,6170929875,V1,190045,A,3127.3378,N,07307.6950,E,000.23,000,060718,FFFFB9FF,410,04,03104,32566# [12] => HQ,6170929875,V1,190055,A,3127.3381,N,07307.6955,E,000.32,000,060718,FFFFB9FF,410,04,03104,32566# ) 0 index is empty. I want to start the array from 0 index. Please help. what I am doing wrong here
The first element of your array is blank because your string begins with *. To solve this simply do: $str = "*HQ,6170929875,V1,185905,A,3127.3354,N,07307.6954,E,000.09,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185915,A,3127.3365,N,07307.6951,E,002.30,018,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185925,A,3127.3372,N,07307.6952,E,000.76,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185935,A,3127.3369,N,07307.6947,E,000.27,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185945,A,3127.3371,N,07307.6951,E,000.27,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185955,A,3127.3377,N,07307.6952,E,000.21,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190005,A,3127.3376,N,07307.6950,E,000.17,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190015,A,3127.3376,N,07307.6953,E,000.07,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190025,A,3127.3375,N,07307.6955,E,000.59,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190035,A,3127.3373,N,07307.6944,E,000.35,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190045,A,3127.3378,N,07307.6950,E,000.23,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190055,A,3127.3381,N,07307.6955,E,000.32,000,060718,FFFFB9FF,410,04,03104,32566#"; $arr = explode('*', $str); array_shift($arr); print_r($arr); Which produces: Array ( [0] => HQ,6170929875,V1,185905,A,3127.3354,N,07307.6954,E,000.09,000,060718,FFFFB9FF,410,04,03104,32566# [1] => HQ,6170929875,V1,185915,A,3127.3365,N,07307.6951,E,002.30,018,060718,FFFFB9FF,410,04,03104,32566# [2] => HQ,6170929875,V1,185925,A,3127.3372,N,07307.6952,E,000.76,000,060718,FFFFB9FF,410,04,03104,32566# [3] => HQ,6170929875,V1,185935,A,3127.3369,N,07307.6947,E,000.27,000,060718,FFFFB9FF,410,04,03104,32566# [4] => HQ,6170929875,V1,185945,A,3127.3371,N,07307.6951,E,000.27,000,060718,FFFFB9FF,410,04,03104,32566# [5] => HQ,6170929875,V1,185955,A,3127.3377,N,07307.6952,E,000.21,000,060718,FFFFB9FF,410,04,03104,32566# [6] => HQ,6170929875,V1,190005,A,3127.3376,N,07307.6950,E,000.17,000,060718,FFFFB9FF,410,04,03104,32566# [7] => HQ,6170929875,V1,190015,A,3127.3376,N,07307.6953,E,000.07,000,060718,FFFFB9FF,410,04,03104,32566# [8] => HQ,6170929875,V1,190025,A,3127.3375,N,07307.6955,E,000.59,000,060718,FFFFB9FF,410,04,03104,32566# [9] => HQ,6170929875,V1,190035,A,3127.3373,N,07307.6944,E,000.35,000,060718,FFFFB9FF,410,04,03104,32566# [10] => HQ,6170929875,V1,190045,A,3127.3378,N,07307.6950,E,000.23,000,060718,FFFFB9FF,410,04,03104,32566# [11] => HQ,6170929875,V1,190055,A,3127.3381,N,07307.6955,E,000.32,000,060718,FFFFB9FF,410,04,03104,32566# )
You could pass it to array_filter to remove first child (index 0). It happen because you have * on first part of string. Exploding by * delimiter mean zero string on first value. Something like: $array = explode("*",$str); $array = array_filter($array);
This is occurring simply because you have a "*" character at the start of the string *HQ,6170929875,V1,185905,A,3127.3354,N,07307.6954,E,000.09,000,060718,FFFFB9FF,410,04,03104,32566#*.... If you always have that character at the start of the string, you will always have an empty index 0 in your resultant array - you need to either remove the first character before exploding the string or the first item of the array.
You might use a combination of array_filter to remove the empty values and array_values to reindex the array to start from 0: $str = "*HQ,6170929875,V1,185905,A,3127.3354,N,07307.6954,E,000.09,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185915,A,3127.3365,N,07307.6951,E,002.30,018,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185925,A,3127.3372,N,07307.6952,E,000.76,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185935,A,3127.3369,N,07307.6947,E,000.27,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185945,A,3127.3371,N,07307.6951,E,000.27,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,185955,A,3127.3377,N,07307.6952,E,000.21,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190005,A,3127.3376,N,07307.6950,E,000.17,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190015,A,3127.3376,N,07307.6953,E,000.07,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190025,A,3127.3375,N,07307.6955,E,000.59,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190035,A,3127.3373,N,07307.6944,E,000.35,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190045,A,3127.3378,N,07307.6950,E,000.23,000,060718,FFFFB9FF,410,04,03104,32566#*HQ,6170929875,V1,190055,A,3127.3381,N,07307.6955,E,000.32,000,060718,FFFFB9FF,410,04,03104,32566#"; print_r(array_values(array_filter(explode("*", $str)))); Result: Array ( [0] => HQ,6170929875,V1,185905,A,3127.3354,N,07307.6954,E,000.09,000,060718,FFFFB9FF,410,04,03104,32566# [1] => HQ,6170929875,V1,185915,A,3127.3365,N,07307.6951,E,002.30,018,060718,FFFFB9FF,410,04,03104,32566# [2] => HQ,6170929875,V1,185925,A,3127.3372,N,07307.6952,E,000.76,000,060718,FFFFB9FF,410,04,03104,32566# [3] => HQ,6170929875,V1,185935,A,3127.3369,N,07307.6947,E,000.27,000,060718,FFFFB9FF,410,04,03104,32566# [4] => HQ,6170929875,V1,185945,A,3127.3371,N,07307.6951,E,000.27,000,060718,FFFFB9FF,410,04,03104,32566# [5] => HQ,6170929875,V1,185955,A,3127.3377,N,07307.6952,E,000.21,000,060718,FFFFB9FF,410,04,03104,32566# [6] => HQ,6170929875,V1,190005,A,3127.3376,N,07307.6950,E,000.17,000,060718,FFFFB9FF,410,04,03104,32566# [7] => HQ,6170929875,V1,190015,A,3127.3376,N,07307.6953,E,000.07,000,060718,FFFFB9FF,410,04,03104,32566# [8] => HQ,6170929875,V1,190025,A,3127.3375,N,07307.6955,E,000.59,000,060718,FFFFB9FF,410,04,03104,32566# [9] => HQ,6170929875,V1,190035,A,3127.3373,N,07307.6944,E,000.35,000,060718,FFFFB9FF,410,04,03104,32566# [10] => HQ,6170929875,V1,190045,A,3127.3378,N,07307.6950,E,000.23,000,060718,FFFFB9FF,410,04,03104,32566# [11] => HQ,6170929875,V1,190055,A,3127.3381,N,07307.6955,E,000.32,000,060718,FFFFB9FF,410,04,03104,32566# )
escaping user input while keeping smarty variables
I have an array of sample user string inputs which may or may not have smarty variables in them which id like to escape with {literal}{/literal} tags. Array ( [0] => {$PLEASE} [1] => {PLEASE} [2] => {{PLEASE}} [3] => {{{PLEASE}}} [4] => {a{PLEASE}} [5] => {a{$PLEASE}} [6] => {{$PLEASE}a} [7] => {{PLEASE}a} [8] => {{{$PLEASE}}} [9] => {{{{PLEASE}}}} ) Here is what I hope to achieve. Array ( [0] => {$PLEASE} [1] => {literal}{PLEASE}{/literal} [2] => {literal}{{PLEASE}}{/literal} [3] => {literal}{{{PLEASE}}}{/literal} [4] => {literal}{a{PLEASE}{/literal} [5] => {literal}{a{/literal}{$PLEASE}{literal}}{/literal} [6] => {literal}{{/literal}{$PLEASE}{literal}a}{/literal} [7] => {literal}{PLEASE}a}{/literal} [8] => {literal}{{{/literal}{$PLEASE}{literal}}}{/literal} [9] => {literal}{{{{PLEASE}}}}{/literal} ) Right now I have this $data = preg_replace('/{+([^\$])([a-z0-9]*)}+/si', '{literal}{\1\2}{/literal}', $data); Which gives me Array ( [0] => {$PLEASE} [1] => {literal}{PLEASE}{/literal} [2] => {literal}{PLEASE}{/literal} [3] => {literal}{PLEASE}{/literal} [4] => {a{literal}{PLEASE}{/literal} [5] => {a{$PLEASE}} [6] => {{$PLEASE}a} [7] => {literal}{PLEASE}{/literal}a} [8] => {{{$PLEASE}}} [9] => {literal}{PLEASE}{/literal} ) Been stuck for quite sometime now, was wondering if anyone could help me figure it out or if its even possible to do so.
ok, I'm sure there's a more elegant way, perhaps one-liner, but whatever, it works with the following: //Step 1: Replace 'real' smarty variables with an intermediate string $data1 = preg_replace('/{(\$\w+)}/', "!!!$1!!!", $arr); //replace start and end curly braces with {literal}: $data2 = preg_replace('/{(.*)}/', '{literal}{$1}{/literal}', $data); //Replace all inner smarty variables with their original string: $data3 = preg_replace('/.!!!(.*)!!!/', '{/literal}$1{literal}', $data2); //Replace standalone variables with their original string: $data4 = preg_replace('/^!!!(.*)!!!$/', '{$1}', $data3); You can merge steps 3&4 in one command
cakephp save array
what would be the efficient way of saving the following array using php (cakephp)? each value needs to go into a new row in the table? Array ( [0] => 6786754654 [1] => 5643564545 [2] => 344544545 [3] => 233245654654 [4] => 453454654654 [5] => 6546542323 [6] => 654654654 [7] => 645654654 etc.... ) thanks
2 choices: Format the array as required by Model::saveAll() Loop through the array calling Model::create(), then Model:save() I'd recommend option 1 as you can use Model::saveAll($data, array('validate' => 'first')); to ensure that all values are valid before saving any of them.