Кластеризация элементов в массиве по именам авторов - PullRequest
2 голосов
/ 23 мая 2011

У меня есть такой массив:

[1] "John", "content1"
[2] "John", "content2"
[3] "John", "content3"
[4] "Jim", "content"
[5] "Joana", "content1"
[6] "Joana", "content2"

Я попытался получить вывод, подобный этому:

<ul>

 <li>John
  <ul>
   <li> content 1 </li>
   <li> content 2 </li>
   <li> content 3 </li>
  </ul>
 </li>

 <li>Jim
  <ul>
   <li> content </li>
  </ul>
 </li>

 <li>Joana
  <ul>
   <li> content 1 </li>
   <li> content 2 </li>
  </ul>
 </li>

</ul>

Я пытался решить его с помощью итерации foreach, но это нене работает вообще: (примечание: $ cur_name означает имя автора, тогда как $ content означает содержание)

 foreach($array as $a) { 
              $cur_name = $a['name'];
    if ($old_name != $cur_name && $cur_name !="")$return .= "<li>";
    if ($old_name != $cur_name && $cur_name !="") {
        $return .= "<strong>$cur_name</strong><br />";
    }
    elseif($cur_name == "") {
    }
    elseif ($old_name == $cur_name) {
    }
    $return .= "$content<br />";
    if ($old_name != $cur_name && $cur_name !="") $return .= "</li>";

    $old_name = $cur_name;

    }
}

Любые идеи высоко оценены.

Ответы [ 3 ]

2 голосов
/ 23 мая 2011

Используйте этот код:

Сделайте что-то вроде этого:

  • итерируйте ваш массив и создайте еще один key -эдированный массив (скажем, $processedArray), где значение ключа берется из 1-го индекса для каждого массива
  • на каждой итерации добавляйте 2-й индекс к соответствующему 1-му ключу.
  • после этого итерируйте этот $processedArray, чтобы вывести его соответствующим образом.

Я знаю, что читать код проще, поэтому попробуйте это:

<?php
$data = array(
    array('name'=>'John', 'content'=>'Content1'),
    array('name'=>'John', 'content'=>'Content2'),
    array('name'=>'John', 'content'=>'Content3'),
    array('name'=>'Jim', 'content'=>'Content'),
    array('name'=>'Joana', 'content'=>'Content1'),
    array('name'=>'Joana', 'content'=>'Content2'),
);

$processedArray = array();

foreach( $data as $each )
{
    if( !isset( $processedArray[ $each[ 'name' ] ] ))
        $processedArray[ $each[ 'name' ] ] = array();
    $processedArray[ $each[ 'name' ] ][] = $each[ 'content' ];
}

echo "<ul>\n";

foreach( $processedArray as $key => $arrVal)
{
    echo "  <li>$key\n";
    echo "    <ul>\n";
    foreach( $arrVal as $value )
    {
        echo "      <li>$value</li>\n";
    }
    echo "    </ul>\n";
    echo "  </li>\n";
}
echo "</ul>\n";
?>
0 голосов
/ 23 мая 2011

Вот базовый код, который сделает это за вас:

<ul>
<?php
$array = array(
                array(  name    => 'John',
                        content => 'content1'),
                array(  name    => 'John',
                        content => 'content2'),
                array(  name    => 'John',
                        content => 'content3'),
                array(  name    => 'Jim',
                        content => 'content'),
                array(  name    => 'Joana',
                        content => 'content1'),
                array(  name    => 'Joana',
                        content => 'content2')
);
foreach($array as $a) {
    if ($a['name'] != $old_name) {
        if (isset($old_name)) $return .= "\t\t</ul>\n\t</li>\n";
        $return .= "\t<li><strong>" . $a['name'] . "</strong>\n\t\t<ul>\n";
    }
    $return .= "\t\t\t<li>" . $a['content'] . "</li>\n";
    $old_name = $a['name'];
}
echo "$return\t\t</ul>\n\t</li>\n";
?>
</ul>
0 голосов
/ 23 мая 2011

Судя по тому, что вы опубликовали, я предполагаю, что данные выглядят так:

$array = array();
$array[1] = array("name" => "John", "content" => "content1");
$array[2] = array("name" => "John", "content" => "content2");
$array[3] = array("name" =>"John", "content" =>"content3");     
$array[4] = array("name" =>"Jim", "content" =>"content");
$array[5] = array("name" =>"Joana", "content" =>"content1");
$array[6] = array("name" =>"Joana", "content" =>"content2");

Если это так, то единственное, что вам не хватает, это то, что $return .= "$content<br />"; должно выглядеть как $return.=$a['content']."<br/>". Кроме того, ваш код имеет дополнительную фигурную скобку в конце, но я предполагаю, что это только из копирования / вставки. И, конечно же, вам нужно отобразить переменную $ return.

...