views:

34

answers:

1

I wrote a code to parse through something, dynamically making an array out of the array keys of one array. This is from a form, so the odd key has a value, and that is somehow the problem.

My code:

//array values are not needed in my code, just junk rather
$array = array('one_a'=>2, 'three_b', 'four_c', 'five_d'=>12);

$number = array();
$letter = array();

foreach($array as $element) {
    $parts = explode("_", $element);
    $number[] = $parts[0];
    $letter[] = $parts[1];
}

print_r($number);

I do not get how this could go wrong, but when the foreach() iterates through the associative array, it reads "2" and "12" as separate array keys! This ruins my $explode code and throws an error, as "2" has no _ in it.

Why does the associative array fail like this? I tried explicitly defining as $element => $value, NOT using $value (to try to ignore it), but it throws even more errors.

+5  A: 

The problem is not, that 2 and 12 are seen as keys, but rather that they are seen as the real values. If you do a print_r($array), you will see:

Array
(
    [one_a] => 2
    [0] => three_b
    [1] => four_c
    [five_d] => 12
)

(three_b and four_c get assigned an automatic incremental array key) So you have to take into account, that the key might by numeric:

<?php
$array = array('one_a'=>2, 'three_b', 'four_c', 'five_d'=>12);

$number = array();
$letter = array();

// get the key separate from the element:
foreach($array as $key => $element) {
    // and now check for the key
    if (is_numeric($key))
        $value = $element;
    else
        $value = $key;

    $parts = explode("_", $value);
    $number[] = $parts[0];
    $letter[] = $parts[1];
}

print_r($number);

This will get you

Array
(
    [0] => one
    [1] => three
    [2] => four
    [3] => five
)
Cassy
Ah, this is really weird, I had worked with PHP for awhile but never came across something like this before. I will seek a different method to parse through form elements like that. Accepted when I can.
John