многомерный массив php array_walk

Я получил три массива с какими-то иерархическими предопределенными терминами

array("fruits", "yellow", "pineapple");
array("fruits", "yellow", "lemon");
array("fruits", "red", "apple");

И у меня есть ассоциативный массив, который имеет своего рода иерархию:

array('fruits'=>array('red'=>array('tomato')));

Как я могу поместить условия моего массива в нужное место, которое я получу:

array('fruits'=>array('yellow'=>array('pineapple','lemon'),'red'=>array('tomato','apple')));

Я использую array_walk? Или array_walk_recursive? Что я должен использовать?

Лучший, Йорг

4 голоса | спросил user987875 26 62011vEurope/Moscow11bEurope/MoscowSat, 26 Nov 2011 14:04:24 +0400 2011, 14:04:24

3 ответа


0

Вы конвертируете каждый фрукт во вложенный массив, затем объединяетесь с помощью array_merge_recursive () .

Вот рабочий пример ( также на Codepad ):

$fruits = array(
  array("fruits", "yellow", "pineapple"),
  array("fruits", "yellow", "lemon"),
  array("fruits", "red", "apple"),
  array("fruits", "red", "tomato"),
);

// Convert array to nested array
function nest($leaf)
{
  if (count($leaf) > 1)
  {
    $key = array_shift($leaf);

    return array($key => nest($leaf));
  }
  else
  {
    return $leaf;
  }
}

$tree = array();

foreach($fruits as $fruit)
{
  // Convert each fruit to a nested array and merge recursively
  $tree = array_merge_recursive($tree, nest($fruit));
}

print_r($tree);
ответил Gustav Bertram 26 62011vEurope/Moscow11bEurope/MoscowSat, 26 Nov 2011 14:50:35 +0400 2011, 14:50:35
0
$fruits[] = array("fruits", "yellow", "pineapple");
$fruits[] = array("fruits", "yellow", "lemon");
$fruits[] = array("fruits", "red", "apple");

foreach($fruits as $fruit) {
  $multifruit[$fruit[0]][$fruit[1]][] = $fruit[2];
}

print_r($multifruit);

/* yields:
Array
(
    [fruits] => Array
        (
            [yellow] => Array
                (
                    [0] => pineapple
                    [1] => lemon
                )

            [red] => Array
                (
                    [0] => apple
                )

        )

)
*/

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

ответил abcde123483 26 62011vEurope/Moscow11bEurope/MoscowSat, 26 Nov 2011 14:09:34 +0400 2011, 14:09:34
0
<?php

$fruits[] = array("fruits", "yellow", "pineapple");
$fruits[] = array("fruits", "yellow", "lemon");
$fruits[] = array("fruits", "red", "apple");
$fruits[] = array("fruits", "blue", "small","blueberry");
$fruits[] = array("fruits", "blue", "bluefruit");
$fruits[] = array("fruits", "multicolor-fruit");

function deeper(&$multifruit, $fruit) {
    if (count($fruit)>2) {
        $shifted = array_shift($fruit);
        deeper($multifruit[$shifted], $fruit);
        return $multifruit;
    } else {
        return $multifruit[$fruit[0]][] = $fruit[1];
    }   
}   

foreach($fruits as $fruit) {
   deeper($multifruit, $fruit);
}   

print_r($multifruit);
?>  

Здесь вы найдете более общее решение вашей проблемы. Это заняло у меня какое-то время, поэтому я надеюсь, что вы это оцените:)

ответил abcde123483 26 62011vEurope/Moscow11bEurope/MoscowSat, 26 Nov 2011 19:29:21 +0400 2011, 19:29:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132