2014-01-07 2 views
0

Краткое описание проекта: Мне нужно вывести определенные значения из существующего массива для вложенной алфавитной навигации. Навигация группирует несколько букв вместе в вкладки (то есть «A-C»), а затем отображает все ссылки на сообщения, начинающиеся с этих букв. Навигация создается плагином, поэтому мне нужно создать переменные для вывода групп.Создайте новый массив из определенных значений существующего многомерного массива с PHP

У меня есть: У меня есть массив, который сортируется в алфавитном порядке с помощью ключа name дочернего массива. Это выглядит как в следующем примере:

Array (
    [0] => Array ( 
    ['name'] => 'Alpha' 
    ['link'] => 'http://www.someurl.com' 
)  

    [1] => Array ( 
    ['name'] => 'Alpha2' 
    ['link'] => 'http://www.someotherurl.com' 
)  

    [2] => Array ( 
    ['name'] => 'Beta' 
    ['link'] => 'http://www.someurl.com' 
) 

    [3] => Array ( 
    ['name'] => 'Delta' 
    ['link'] => 'http://www.someotherurl.com' 
) 

    [4] => Array ( 
    ['name'] => 'Zephyr' 
    ['link'] => 'http://www.someurl.com' 
) 
) 

То, что я думаю, что должно произойти: Мне нужно создать 5 новых массивов, что группа этих дочерних массивы в алфавитном порядке. Смысл, мне нужно получить все массивы, name начинается с «A» - «C» в один массив, «D» - «G» в другой и т. Д.

Другими словами, приведенный выше массив привел бы к последующий создается:

$a_c = array(
    [0] => Array ( 
    ['name'] => 'Alpha' 
    ['link'] => 'http://www.someurl.com' 
)  
    [1] => Array ( 
    ['name'] => 'Alpha2' 
    ['link'] => 'http://www.someotherurl.com' 
)  
    [2] => Array ( 
    ['name'] => 'Beta' 
    ['link'] => 'http://www.someurl.com' 
) 
); 

$d_g = array(
    [0] => Array ( 
    ['name'] => 'Delta' 
    ['link'] => 'http://www.someotherurl.com' 
) 
); 
$h_l = array(); 
$m_r = array(); 
$s_t = array(); 
$u_z = array(
    [0] => Array ( 
    ['name'] => 'Zephyr' 
    ['link'] => 'http://www.someurl.com' 
) 
); 

Если такие, как [5] => Array (['name'] => 'Kappa' ['link'] => 'http://www.someurl.com') добавляется к первому массиву новое значение массива, он будет добавлен в массив в переменной $h_l.

Кто-нибудь знает, как и если это можно сделать?

+1

Что вы пробовали? –

+0

@almo do: Я не пробовал много ... Я честно не знаю, что попробовать или даже, что искать, чтобы помочь мне разобраться. Я видел вещи, разделяющие массив на отдельные буквы (это означает, что структура навигации, такая как «A», «B», «C», а не «A-C»), но не похожа на ту, которая мне нужна. Любые мысли о том, на что я могу смотреть? – Baerkins

ответ

1

Вот один способ, использующий конечный массив вывода, а не много разных массивов диапазона.

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

// define ranges 
$ranges=array(
    'A-C'=>range('A','C'), 
    'D-G'=>range('D','G'), 
    'H-K'=>range('H','K'), 
    'L-O'=>range('L','O'), 
    'P-S'=>range('P','S'), 
    'T-W'=>range('T','W'), 
    'X-Z'=>range('X','Z') 
); 

// build final array with each entry in its appropriate range 
$final=array(); 
foreach ($data as $item) { 
    $first_letter=strtoupper(substr($item['name'],0,1)); 
    foreach ($ranges as $label => $range) { 
     if (in_array($first_letter,$range)) { 
      $final[$label][]=$item; 
      break; 
     } 
    } 
} 

// output the final array 
echo"<pre>".print_r($final,true)."</pre>"; 

Вот результат:

Array 
(
    [A-C] => Array 
     (
      [0] => Array 
       (
        [name] => Alpha 
        [link] => http://www.someurl.com 
       ) 

      [1] => Array 
       (
        [name] => Alpha2 
        [link] => http://www.someotherurl.com 
       ) 

      [2] => Array 
       (
        [name] => Beta 
        [link] => http://www.someurl.com 
       ) 

     ) 

    [D-G] => Array 
     (
      [0] => Array 
       (
        [name] => Delta 
        [link] => http://www.someotherurl.com 
       ) 

     ) 

    [X-Z] => Array 
     (
      [0] => Array 
       (
        [name] => Zephyr 
        [link] => http://www.someurl.com 
       ) 

     ) 

) 

http://phpfiddle.org/main/code/w06-sc5

+0

Спасибо за помощь, это сработало отлично !!! – Baerkins

0

Если критерии для определения того, какие значения входят в какой массив - это просто имя, есть ли причина, по которой вы не можете просто пропустить основной массив с помощью foreach(), а шаблон соответствует первому символу? В качестве альтернативы вы можете использовать substr(), чтобы сохранить первый символ в переменной, а затем сопоставить это с тестом switch(). Если это была чисто индивидуальная договоренность (т. Е. У вас был другой массив для каждой буквы алфавита), вы могли бы использовать динамически именованную переменную для создания ассоциации.

0

Хорошо, я пишу идею, которую я имел. С помощью $$ Я получаю доступ к параметрическому имени переменной. Значение (пример $ a_c, $ d_f, ecc ...) генерируется начиная с информации, которую я использовал на основе фактического параметра «name».

Имени переменное:

Я получаю начальную букву фактического значения [ «имя»] (с подстрокой). С ord() Я получаю соответствующее значение в ascii.

Разделение/3 и умножение на 3, я получаю первую букву «группы букв», в которой она принадлежит (пример: если первая буква «B», я получу «a», A_C ").

Это значение + 2 является окончательной буквой.

Я добавляю эти две информации, возвращаясь к строке с chr().

я не проверял на всех, вот пример псевдокода:

foreach ($myarray as $value) 
{ 
    //finding the name of the variable. the variable name is derived by the letter of the actual value["name"]. the last letter is the first + 2. the name is divided by an underscore. 
    $first_letter = intval((substr(ord($value["name"], 0, 1)) - ord('A'))/3)*3 + ord('A'); 
    $last_letter = $first_letter + 2; 
    $var_name = chr($first_letter)."_".chr($first_letter); 
    if (!isset($$var_name)) 
     $$var_name = array(); 
    $$var_name[] = $value; 
} 
0

Попробуйте эту функцию. Эта функция состоит из двух параметров: одна - это буква, которую вы хотите найти, а другая - исходный массив.

function getNewArray($letter='A',$arr){ 
    if(!is_array($arr)) return; 
    $result=array(); 
    foreach($arr as $a){ 
    if(strtolower(trim($a['name'][0])) === strtolower($letter)){ 
      $result[] = $a; 
    } 
    } 
    return $result; 
} 

// Эта функция возвращает массив с именем, начинающимся с буквы m. первый аргумент NOT с учетом регистра getNewArray('M',$array); // здесь $ array - ваш исходный массив.

Смежные вопросы