2014-10-22 2 views
0

У меня есть массив с плавающими индексами, которые я получаю от плагина. Я хочу проанализировать этот массив и взять те, которые являются float и помещают их в качестве нового массива. Значение того, что у меня естьПроанализируйте массив php с индексом float в новый массив

[1] => gsurvey128f54af2 
[2] => gsurvey282bd4253 
[5.1] => gsurvey5649a964f 
[5.2] => gsurvey5fddb5e9f 
[5.3] => gsurvey533c5b311 
[5.4] => gsurvey5c8933efb 
[5.5] => gsurvey5da48f59b 

Что я хочу:

[1] => gsurvey128f54af2 
    [2] => gsurvey282bd4253 
    [5] => array ( 
     [0] => gsurvey5649a964f 
     [1] => gsurvey5fddb5e9f 
     [2] => gsurvey533c5b311 
     [3] => gsurvey5c8933efb 
     [4] => gsurvey5da48f59b 
) 

Я не совсем уверен, что это лучший способ приблизиться к этому.

+1

Вы уверены, что у вас есть эти ключи для вашего массива, так как поплавок является недопустимым значением ключа –

+0

Вы можете измените код, генерирующий этот интересный массив, точно, что у вас есть в вашем результате. Поплавки недействительны. – David

+0

Они на самом деле строки. Попробуйте 'var_dump'. – AbraCadaver

ответ

0

Для этого конкретного случая, это должно работать:

foreach($array as $k => $v) { 
    if(count($i = explode('.', $k)) > 1) { 
     $result[$i[0]][] = $v; 
    } else { 
     $result[$k] = $v; 
    } 
} 
+0

Уход за конструктивной критикой? – AbraCadaver

+0

Ваш код не обрабатывает случаи, когда нет. в ключе. Запрос состоит в том, что они сопоставляются с новым массивом как есть. – kainaw

+0

Черт, я тестировал в своей среде IDE и никогда не редактировал ответ. Отредактировано, спасибо за объяснение. – AbraCadaver

1

Я сделал замечание выше, что эта проблема очень подвержена ошибкам, потому что можно иметь вход, который будет устанавливать одно значение быть как строка и массив одновременно. Это, очевидно, потерпит неудачу. Предполагая, что вход чист ...

$new_array = array(); 
foreach($old_array as $key=>$val) 
{ 
    $a = explode('.', $key); 
    if(sizeof($a)==2) 
    { 
    if(!isset($new_array[$a[0]])) $new_array[$a[0]] = array(); 
    $new_array[$a[0]][] = $val; 
    } 
    else $new_array[$key]=$val; 
} 
+0

Это сработало. Он оставляет дополнительный пустой индекс в конце каждого из них, но я могу его отладить в этот момент. Спасибо. – tonyarash

+0

Я протестировал его, используя массив примеров из вашего вопроса, и я не вижу пустой индекс. Я не уверен, откуда это может произойти. Возможно, вы можете сбросить проверку «isset», чтобы установить ключ $ a [0]. Это просто для того, чтобы помочь новым программистам прочитать код. PHP создает ключ в следующей строке, если он не существует. Таким образом, код отлично работает без него. – kainaw

+0

Это было из-за пустого в моей форме, поэтому код, который вы положили, отлично работает. – tonyarash

0

Пример с array_walk:

$array = array (
    '1' => 'gsurvey128f54af2', 
    '2' => 'gsurvey282bd4253', 
    '5.1' => 'gsurvey5649a964f', 
    '5.2' => 'gsurvey5fddb5e9f', 
    '5.3' => 'gsurvey533c5b311', 
    '5.4' => 'gsurvey5c8933efb', 
    '5.5' => 'gsurvey5da48f59b' 
); 

$output = array(); 
array_walk($array, function($item, $key) use (&$output) { 
    $keys = explode('.', $key); 
    isset($keys[1]) ? $output[ $keys[0] ][ $keys[1] ] = $item : $output[ $keys[0] ] = $item; 
}); 

print_r($output); 
/* 
Array 
(
    [1] => gsurvey128f54af2 
    [2] => gsurvey282bd4253 
    [5] => Array 
     (
      [1] => gsurvey5649a964f 
      [2] => gsurvey5fddb5e9f 
      [3] => gsurvey533c5b311 
      [4] => gsurvey5c8933efb 
      [5] => gsurvey5da48f59b 
     ) 

) 
*/ 
Смежные вопросы