tags:

views:

73

answers:

3

I'm getting an array of values back from a database where I get an array with values like this:

Array ( [6712] => 64.79.197.36:43444 [6712] => 64.79.197.36:43444 [6711] => 64.79.194.56:41113 [6710] => 64.21.47.20:8080 [6709]) 

Where the numbers in brackets, like [6712] are the "id" field in the database.. the issue is that in my script I want to make it so that the each array value has a second key that I assign, which starts from "0" and increments by one, so something like:

Array ( [0][6712] => 64.79.197.36:43444 [1][6712] => 64.79.197.36:43444 [2][6711] => 64.79.194.56:41113 [3][6710] => 64.21.47.20:8080 [4][6709]) 

This is for some data processing so I want to be able to have a way to track each one in a meaningful way within my script (As I can't predict what the mysql id would be as there may be deleted records, etc so its not always incremented by 1)..

I have found some ways to create a new array by assigning a new key but I'm wondering if its possible to have 2 keys for 1 array value

+1  A: 

Well, my PHP is a bit rusty, but let me crack my dusty knuckles on this one:

I would make a transformer function for this. It accepts the first array as its input (the one with "6712" et. al. as its key), and returns the second array as its output.

Sorry for any and all syntax errors, but here it goes:

function indexer ($array) {
  $result = array();
  $i = 0;
  foreach ($array as $key => $value) {
    $result[$i][$key] = $value;
    $i++;
  }
  return $result;
}

But! If you don't strictly need the two-dimensional array, you can iterate over an array without all that overhead. See the reset(), next() and prev() functions. In case you're interested in the key (which you probably are, in your case), see also the each() function.

Remember that each array has a stateful internal pointer. This means, if you pass around the array a lot, the state of the pointer will be remembered. So call reset() appropriately.

Henrik Paul
Thanks for taking the time to write this out.. I will give it a try.. actually the next(), prev() should work for most things I need it for but this just kind of got my curiosity (assigning a 2nd id) as to if I can do this as I think it will be necessary for some of the more complex things I am trying to do
Rick
+3  A: 

It's perfectly possible, using references.

$result = array ( 6712  => '64.79.197.36:43444',
                  6711  => '64.79.194.56:41113',
                  6710  => '64.21.47.20:8080'
                );
$i = 0;
foreach($result as $key => $value) {
    $result[$i++] = &$result[$key];
}

var_dump($result);
echo '<br />';
$result[0] = '127.0.0.1:80';

var_dump($result);
echo '<br />';

but it's likely to prove problematic for you to work with.

The above code titbit demonstrates setting an initial array, then allocating a second key for each of the three values in the initial array. Then, the code modifies a single entry in the array, and demonstrates that the change is reflected in both key values;

EDIT

Having the two keys in one array will be cumbersome to work with if you want to use foreach(), curr(), and other control structures elements that manipulate your position in the array, because you'll pick up each entry twice.

It might be easier to work with two arrays, the second being a series of pointers to the first.

$result = array ( 6712  => '64.79.197.36:43444',
                  6711  => '64.79.194.56:41113',
                  6710  => '64.21.47.20:8080'
                );
$wrkResult = array();
foreach($result as $key => $value) {
    $wrkResult[] = &$result[$key];
}

var_dump($result);
echo '<br />';
var_dump($wrkResult);
echo '<br />';
$result[0] = '127.0.0.1:80';

var_dump($result);
echo '<br />';
var_dump($wrkResult);
echo '<br />';

Then you can work using either $result or $wrkResult, and any change to the values in one will be refelected in the other; you can loop through one or other and only get the correct number of results, not twice as many, etc.

Mark Baker
Thanks, well in my case, the initial key is actually an unknown variable by the script as its just given by the mysql database and has no reference point for utilizing it, its only useful for updating the database after changes are made to the corresponding value, so the other key would be what I would be using in the php script, so I don't think it would be too hard to work with this way
Rick
A: 
$keys = array_keys($array);
$values = array_values($array);

$easyArray = array();

foreach($keys as $keyId => $key) {
    $easyArray[$keyId] = array(
        'id'     =>  $key,
        'addr'   =>  $values[$keyId]
    );
}

Then you have an easy array to work with, indexed from 0 to number-of-rows -1, with the correct number of dimensions:

// get the id of element $i:
$easyArray[$i]['id']

// get the address of element $i
$easyArray[$i]['addr']
Jhong