Кластеризация элементов в массиве по именам авторов
У меня есть массив, как это:
[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 ответа
Используйте этот код:
Сделайте что-то вроде этого:
- итерируйте свой массив и создайте другой
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";
?>
Вот некоторый основной код, который сделает это за вас:
<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>
Судя по тому, что вы опубликовали, я предполагаю, что данные выглядят так:
$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.