Сортировка и получение частоты значений в массиве в php?

У меня есть XML-файл со списком названий полей. Я хочу хранить их в массиве, сортировать их в алфавитном порядке, а затем, в котором «заголовок» появляется больше всего. Мой настоящий XML-файл огромен для копирования здесь (PS: я импортирую из группы XML-файлов).

В двух словах, это пример того, как выглядят файлы XML.

<add overwrite="true">
<docs>

<field name="id">9637a08df6aa0765</field>
<field name="url">http://somewebsite.ca </field>
<field name="blogurl">http://www.someblog.com</field>
<field name="published">2015-05-21</field>
<field name="language">English</field>
<field name="title">Stephen Harper</field>
<field name="title">Mike Duffy Trial</field>
<field name="title">POTUS on Twitter</field>
<field name="title">Tim Hortons Closed</field>
<field name="title">Stephen Harper</field>
<field name="title">The New iPhone</field>
<field name="title">Stephen Harper</field>
</docs>
</add>

Допустим, я получил атрибут title из файла XML и сохранил их в массиве. Затем я хочу отсортировать этот массив в алфавитном порядке, а затем по частоте «заголовков».

Это то, что я до сих пор.

<?php

$titles_array = array();
$counter = 0;
$xml = simplexml_load_file("fields.xml") or die ("Error: Cannot Create Object");

foreach($xml->docs->field as $fields){
array_push ($titles_array, $fields);
echo $fields . "<br>";
$counter++;
}

echo '<p>' . "Sorted Array" . '</p>';

sort($titles_array);

for ($a=0; $a<$counter; $a++){
echo $titles_array[$a] . "<br>";
}

?>

Вывод на самом деле не в алфавитном порядке?
Кроме того, как мне показать наиболее часто встречающиеся «заголовки»?

1

Решение

Ваш $fields на самом деле будет целым SimpleXMLElement внутри вашего цикла foreach. Ваши массивы будут отсортированы, как ожидается, если вы используете это вместо:

array_push($titles_array, (string)$fields);

Для подсчета вхождений создайте другой массив:

$titles_count = array();

Затем в вашем цикле сделайте что-то вроде этого:

if (isset($titles_count[(string)$fields])) {
$titles_count[(string)$fields] = $titles_count[(string)$fields] + 1;
} else {
$titles_count[(string)$fields] = 1;
}

Наконец, получите ваш ключ с наибольшим количеством, как это:

echo array_search(max($titles_count), $titles_count);

Соберите весь этот код так:

<?php

$titles_array = array();
$titles_count = array();
$xml = simplexml_load_file("fields.xml") or die ("Error: Cannot Create Object");

foreach($xml->docs->field as $fields){
array_push ($titles_array, (string)$fields);
echo $fields . "<br>";

// First we check if the key exists.
// Example $titles_count['Tim Hortons Closed']
if (isset($titles_count[(string)$fields])) {
// If it does, augment the count by 1;
$titles_count[(string)$fields] = $titles_count[(string)$fields] + 1;
} else {
// If it doesn't yet, set the count to 1;
$titles_count[(string)$fields] = 1;
}
}

echo "<p>Sorted Array</p>";

sort($titles_array);

for ($a=0; $a<$counter; $a++){
// Let's put the count in for each one:
echo $titles_array[$a] . "(" . $titles_count[$titles_array[$a]] . ")" . "<br>";
}

echo "<p>Highest key count:</p>";

// Here we get the value with the highest count use max(...)
// Then we get it's key (example 'Tim Hortons Closed')
echo array_search(max($titles_count), $titles_count);

?>
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]