tags:

views:

4150

answers:

6

Array(0=> blabla 1 => blabla 2 => blblll) etc..

Is there a way to change all the numeric keys to "Name" without looping through the array (so a php function)?

+11  A: 

No, there is not, for starters, it is impossible to have an array with elements sharing the same key

$x =array(); 
$x['foo'] = 'bar' ; 
$x['foo'] = 'baz' ; #replaces 'bar'

Secondarily, if you wish to merely prefix the numbers so that

$x[0] --> $x['foo_0']

That is computationally implausible to do without looping. No php functions presently exist for the task of "key-prefixing", and the closest thing is "extract" which will prefix numeric keys prior to making them variables.

The very simplest way is this:

function rekey( $input , $prefix )
{ 
  $out = array(); 
  foreach( $input as $i => $v )
  { 
    if ( is_numeric( $i ) ) 
    { 
       $out[$prefix . $i] = $v; 
       continue; 
    }
    $out[$i] = $v;
  }
  return $out;
}

Additionally, upon reading XMLWriter usage, I believe you would be writing XML in a bad way.

<section> 
  <foo_0></foo_0>
  <foo_1></foo_1>
  <bar></bar>
  <foo_2></foo_2>
</section>

Is not good XML.

<section> 
  <foo></foo>
  <foo></foo>
  <bar></bar>
  <foo></foo>
</section>

Is better XML, because when intrepreted, the names being duplicate don't matter because they're all offset numerically like so:

   section => { 
       0 => [ foo , {} ]
       1 => [ foo , {} ]
       2 => [ bar , {} ]
       3 => [ foo , {} ] 
   }
Kent Fredric
Thank you! Ofcourse I can't believe i missed the replacing part.
+1  A: 

The solution to when you're using XMLWriter (native to PHP 5.2.x<) is using $xml->startElement('itemName'); this will replace the arrays key.

A: 

You could create a new array containing that array, so:

<?php
$array = array();
$array['name'] = $oldArray;
?>
Sebastian Hoitz
+3  A: 

If you have an array of keys that you want to use then use array_combine

Given $keys = array('a', 'b', 'c', ...) and your array, $list, then do this:

$list = array_combine($keys, array_values($list));

List will now be array('a' => 'blabla 1', ...) etc.

You have to use array_values to extract just the values from the array and not the old, numeric, keys.

That's nice and simple looking but array_values makes an entire copy of the array so you could have space issues. All we're doing here is letting php do the looping for us, not eliminate the loop. I'd be tempted to do something more like:

foreach ($list as $k => $v) {
   unset ($list[$k]);

   $new_key =  *some logic here*

   $list[$new_key] = $v;
}

I don't think it's all that more efficient than the first code but it provides more control and won't have issues with the length of the arrays.

Eric Goodwin
A: 

Use array array_flip in php

$array = array ( [1] => Sell [2] => Buy [3] => Rent [4] => Jobs )

print_r(array_flip($array));

Array ( [Sell] => 1 [Buy] => 2 [Rent] => 3 [Jobs] => 4 )

makewebapp
A: 

I think that he want:

$a = array(1=>'first_name', 2=>'last_name'); $a = array_flip($a);

$a['first_name'] = 3; $a = array_flip($a);

print_r($a);

intel