how to add data dynamically to an array - php

I want to add two element in an array. The first one is the key and the second is the value. But I want to add it dynamically. I want to do it like the following code:
$arr="";
for( $i=0;$i<20;$i++ ) {
$arr[$i]=arr($i=>$i+1);
array_push($arr[$i]);
}
print_r($arr);
But of course it don't work. Could anyone tell me how to do it ?

Maybe you are trying to do this:
$arr = array(); // use array() instead of empty string
for( $i=0; $i<20; $i++ ) {
$arr[$i]= $i + 1;
}
print_r($arr);

$arr must be an array not string try this
$arr= array();
instead of
$arr="";

Not sure what you mean by all this, but you didn't really define the arrays correctly.
$arr = array();
for($i=0;$i<20;$i++) {
$arr[$i] = $i + 1;
array_push($arr[$i]);
}
print_r($arr);
Like answered above, you must use the array() function.

Try this way
$arr = array();
for($i=0;$i<20;$i++) {
$arr[$i] = $i+1;
}
print_r($arr);

This is tested and working
<?php
$stack = array("");
for($i=0;$i<20;$i++) {
array_push($stack, $i);
}
print_r($stack);
?>
this code will allow you to do what you request, unless I understood your requirement wrong?
Let me know if this is any help :)
If you are trying to create a numbered list, then use this instead:
<?php
$stack = array("0");
for($i=1;$i<20;$i++) {
array_push($stack, $i);
}
print_r($stack);
?>
Checkout the php manual: http://uk3.php.net/array_push
Josh.

Related

Turn multiple arrays into JSON

I am trying to make a JSON object out of multiple Array in PHP.
$a = array("Wis","Dex","Cha" );
$b = array(1,2,2);
$c = array("Perception","Stealth","Intimidation");
$d = array(8,5,1);
and I'm trying to get a bunch of JSON out of it such as this:
{ $c[0]:$d[0], "Stat":$a[0], "Multiplier:$b[0] };
and to get all those JSON and turn them in a string. But I've been trying to understand how json_encode works, but I cannot figure it out. I am hoping someone will be able to explain to me how to manipulate these values to turn them in JSON.
You can manually create the desired array using a for loop, then use json_encode on it. You have to be sure that the four arrays are the same size though.
$n = count($a);
$combined = array();
for ($i = 0; $i < $n; $i++) {
$entry = array();
$entry[$c[$i]] = $d[$i];
$entry["Stat"] = $a[$i];
$entry["Multiplier"] = $b[$i];
$combined[$i] = $entry;
}
$json = json_encode(combined);
How do you want the data to come out? As a JSON array of JSON object strings, or each string individually?
<?php
$a = array("Wis","Dex","Cha" );
$b = array(1,2,2);
$c = array("Perception","Stealth","Intimidation");
$d = array(8,5,1);
$data[$c[0]]=$d[0];
$data["Stat"]=$a[0];
$data["Multiplier"]=$b[0];
print(json_encode($data));
?>
Will give you something like
{"Perception":8,"Stat":"Wis","Multiplier":1}
If you want an array of those, then a few changes:
<?php
$a = array("Wis","Dex","Cha" );
$b = array(1,2,2);
$c = array("Perception","Stealth","Intimidation");
$d = array(8,5,1);
for($i=0;$i<count($a);$i++){
$data[$i][$c[$i]]=$d[$i];
$data[$i]["Stat"]=$a[$i];
$data[$i]["Multiplier"]=$b[$i];
}
print(json_encode($data));
?>
Which will give you something like
[{"Perception":8,"Stat":"Wis","Multiplier":1},
{"Stealth":5,"Stat":"Dex","Multiplier":2},
{"Intimidation":1,"Stat":"Cha","Multiplier":2}]

Remove Duplicate Values from an array with ignoring last two characters

I am working on a small php script, currently i have an array like this
[0] yassine#m, [1] yassine#f, [2] Dolmi#m , [3] yassine#l
I want PHP to check if there is a duplicated element (yassine in this case) and return something like this.
[0] yassine , [1] Dolmi#m
array_unique won't work. And i really don't have any clue how to solve this. If looked for a solution on the internet but doesnt seem to find it. Anyone can help Please ?
I think this may work for you.
First sort array by value, then use combination of substr(), strpos() and array_push() to create new array according to your need
then remove duplicate value using array_unique()
<?php
$oldarray = array("suman#1","suman#2","suman#3","sujan#1","suresh#2","");
// first sort array by value so matching value comes together
asort($oldarray);
$newarray = array();
$count = count($oldarray);
for($i=0; $i < $count-1; $i++){
$a = $oldarray[$i];
$b = $oldarray[$i+1];
if($i == 0)
$c = "";
else
$c = $oldarray[$i-1];
if(substr($a,0,strpos($a,"#")) == substr($b,0,strpos($b,"#")) || substr($a,0,strpos($a,"#")) == substr($c,0,strpos($c,"#")) ){
array_push($newarray,substr($a,0,strpos($a,"#")));
}
else
array_push($newarray,$a);
}
print_r($oldarray);
// now remove duplicate value from new array
$newarray = array_unique($newarray);
print_r($newarray);
?>
Check following solution
http://ideone.com/fork/kJlLbs
<?php
function generateUniqueList ($arr){
$ret = array();
foreach ($arr as $value) {
$key = explode("#", $value)[0];
if (array_key_exists($key, $ret)) {
$ret[$key] = $key;
}
else {
$ret[$key] = $value;
}
}
return array_values($ret);
}
$arr = array("yassine#m","yassine#f","Dolmi#m", "yassine#l");
$list = generateUniqueList ($arr);
print_r($list);

why this is not the array I need?

I have an array $num_arr ,so I want get a new array that It's sum is smaller than 10,so i write the code like this,
$num_arr=array(1,3,6,5,4,2,7,9,5,3,6,2,4,7);
$sum=0;
for($i=0;$i<=count($num_arr);$i++){
$sum+=$num_arr[$i];
$k++;
if($sum>=10){
$need_arr[]=array_slice($num_arr,0,$k);
array_splice($num_arr,0, $k);
$k=0;
$sum=0;
}
}
The result $need_arr is not right,that is why and how can get the right array like this: array(array(1,3,6),array(5,4),array(2,7),array(9),...)?
Implemented a "oneliner" just for fun:
$num_arr=array(1,3,6,5,4,2,7,9,5,3,6,2,4,7);
$result = array_reduce($num_arr, function($result, $curr) {
if (!count($result)) {
$result[] = array();
}
$last =& $result[count($result) - 1];
if (array_sum($last) + $curr > 10) {
$result[] = array($curr);
} else {
$last[] = $curr;
}
return $result;
}, array());
var_dump($result);
Online demo: http://ideone.com/aFVmkp
Among other things, you are changing the length of the array when you use array_splice, but you aren't adjusting $i in any way.
In fact, you can remove that array_splice line entirely, since you're continuing to iterate over the array.
Also, you're only starting a new array if you're over 10. You should change your condition to this:
if(!isset($num_arr[$i+1]) || $sum+$num_arr[$i+1] >= 10)

Simple way to check an array for "holes" in the keys

I have a simple associative array:
$ar = array( 1=>'foo', 2=>'bar', 5=>'foobar', 8=>'barfoo' )
I need to efficiently find holes in the keys. The keys are guaranteed to be integers.
findHole($ar)
> 0
findHole($ar,1)
> 3
findHole($ar,5)
> 6
what is the easiest way to do this?
Try this:
function findHole($array, $key=0) {
while (array_key_exists($key, $array)) {
$key++;
}
return $key;
}
The desired behavior of your findHole function isn't 100% clear to me, but the following code snippet will give you an array that has all the "missing" indexes.
$ar = array( 1=>'foo', 2=>'bar', 5=>'foobar', 8=>'barfoo' );
$keys = array_keys($ar);
$missing_indexes = array_diff(range(0,max($keys)), $keys);
print_r($missing_indexes);
Depending on your use case this may or may not be less efficient. It's using multiple function calls and arrays are passed around by value by default, but those functions are operating at native code speeds, while solutions using loops are going to be running at PHP speed.
Use case, benchmark, etc.
All holes:
function GetHoles($arr)
{
$holes = array();
$max_value = max(array_keys($arr));
for($i = 0; $i < $max_value; $i++)
{
if(!in_array($i, $keys)) $holes[] = $i;
}
return $holes;
}
if you just want to condense the array, try this:
function FlattenArray( $o )
{
$res = array();
foreach($o as $v)
{
$res = array_merge($res, FlattenArray($v));
}
return $res;
}

Why does my PHP code not work?

Below is the code:
function swap(&$a, &$b)
{
list($a, $b) = array($b, $a);
}
for ($i=0; count($resultset);$i++)
{
for($j=1;$j<5;$j++)
{
$k = rand(1, 4);
swap($resultset[$i]["option".$j],$resultset[$i]["option".$k]);
}
}
It is a two-dimensional array from a MySQL query, I want to shuffle the values whose keys are option1, option2, option3 and option4. But my code doesn't work. I can find the error by myself. Please suggest. Thanks in advance!
Just saw it:
for ($i=0; count($resultset);$i++)
shouldn't it be
for ($i=0; $i < count($resultset);$i++)
You missed out the comparison in the for loop.
That's a very inefficient, bug-prone and unreadable way of doing that. You might want to try this:
$optionKeys = array('option1', 'option2', 'option3', 'option4');
foreach ($resultSet as &$row) {
# Get options
$options = array_intersect_key($row, array_flip($optionKeys));
# randomize
shuffle($options);
# re-assemble key=>value array
$options = array_combine($optionKeys, $options);
# assign back to $row
$row = $options + $row;
}

Categories