PHP разбить массив на более мелкие четные массивы
У меня есть функция, которая должна разбивать мой массив на более мелкие, равномерно распределенные массивы, однако, похоже, по пути они дублируют мои данные. Если кто-нибудь может мне помочь, это было бы здорово.
Вот оригинальный массив:
Array
(
[0] => stdClass Object
(
[bid] => 42
[name] => Ray White Mordialloc
[imageurl] => sp_raywhite.gif
[clickurl] => http://www.raywhite.com/
)
[1] => stdClass Object
(
[bid] => 48
[name] => Beachside Osteo
[imageurl] => sp_beachside.gif
[clickurl] => http://www.beachsideosteo.com.au/
)
[2] => stdClass Object
(
[bid] => 53
[name] => Carmotive
[imageurl] => sp_carmotive.jpg
[clickurl] => http://www.carmotive.com.au/
)
[3] => stdClass Object
(
[bid] => 51
[name] => Richmond and Bennison
[imageurl] => sp_richmond.jpg
[clickurl] => http://www.richbenn.com.au/
)
[4] => stdClass Object
(
[bid] => 50
[name] => Letec
[imageurl] => sp_letec.jpg
[clickurl] => www.letec.biz
)
[5] => stdClass Object
(
[bid] => 39
[name] => Main Street Mordialloc
[imageurl] => main street cafe.jpg
[clickurl] =>
)
[6] => stdClass Object
(
[bid] => 40
[name] => Ripponlea Mitsubishi
[imageurl] => sp_mitsubishi.gif
[clickurl] =>
)
[7] => stdClass Object
(
[bid] => 34
[name] => Adrianos Pizza & Pasta
[imageurl] => sp_adrian.gif
[clickurl] =>
)
[8] => stdClass Object
(
[bid] => 59
[name] => Pure Sport
[imageurl] => sp_psport.jpg
[clickurl] => http://www.puresport.com.au/
)
[9] => stdClass Object
(
[bid] => 33
[name] => Two Brothers
[imageurl] => sp_2brothers.gif
[clickurl] => http://www.2brothers.com.au/
)
[10] => stdClass Object
(
[bid] => 52
[name] => Mordialloc Travel and Cruise
[imageurl] => sp_morditravel.jpg
[clickurl] => http://www.yellowpages.com.au/vic/mordialloc/mordialloc-travel-cruise-13492525-listing.html
)
[11] => stdClass Object
(
[bid] => 57
[name] => Southern Suburbs Physiotherapy Centre
[imageurl] => sp_sspc.jpg
[clickurl] => http://www.sspc.com.au
)
[12] => stdClass Object
(
[bid] => 54
[name] => PPM Builders
[imageurl] => sp_ppm.jpg
[clickurl] => http://www.hotfrog.com.au/Companies/P-P-M-Builders
)
[13] => stdClass Object
(
[bid] => 36
[name] => Big River
[imageurl] => sp_bigriver.gif
[clickurl] =>
)
[14] => stdClass Object
(
[bid] => 35
[name] => Bendigo Bank Parkdale / Mentone East
[imageurl] => sp_bendigo.gif
[clickurl] => http://www.bendigobank.com.au
)
[15] => stdClass Object
(
[bid] => 56
[name] => Logical Services
[imageurl] => sp_logical.jpg
[clickurl] =>
)
[16] => stdClass Object
(
[bid] => 58
[name] => Dicount Lollie Shop
[imageurl] => new dls logo.jpg
[clickurl] =>
)
[17] => stdClass Object
(
[bid] => 46
[name] => Patterson Securities
[imageurl] => cmyk patersons_withtag.jpg
[clickurl] =>
)
[18] => stdClass Object
(
[bid] => 44
[name] => Mordialloc Personal Trainers
[imageurl] => sp_mordipt.gif
[clickurl] => #
)
[19] => stdClass Object
(
[bid] => 37
[name] => Mordialloc Cellar Door
[imageurl] => sp_cellardoor.gif
[clickurl] =>
)
[20] => stdClass Object
(
[bid] => 41
[name] => Print House Graphics
[imageurl] => sp_printhouse.gif
[clickurl] =>
)
[21] => stdClass Object
(
[bid] => 55
[name] => 360South
[imageurl] => sp_360.jpg
[clickurl] =>
)
[22] => stdClass Object
(
[bid] => 43
[name] => Systema
[imageurl] => sp_systema.gif
[clickurl] =>
)
[23] => stdClass Object
(
[bid] => 38
[name] => Lowe Financial Group
[imageurl] => sp_lowe.gif
[clickurl] => http://lowefinancial.com/
)
[24] => stdClass Object
(
[bid] => 49
[name] => Kim Reed Conveyancing
[imageurl] => sp_kimreed.jpg
[clickurl] =>
)
[25] => stdClass Object
(
[bid] => 45
[name] => Mordialloc Sporting Club
[imageurl] => msc logo.jpg
[clickurl] =>
)
)
Вот функция php, которая предназначена для разделения массива:
function split_array($array, $slices) {
$perGroup = floor(count($array) / $slices);
$Remainder = count($array) % $slices ;
$slicesArray = array();
$i = 0;
while( $i < $slices ) {
$slicesArray[$i] = array_slice($array, $i * $perGroup, $perGroup);
$i++;
}
if ( $i == $slices ) {
if ($Remainder > 0 && $Remainder < $slices) {
$z = $i * $perGroup +1;
$x = 0;
while ($x < $Remainder) {
$slicesRemainderArray = array_slice($array, $z, $Remainder+$x);
$remainderItems = array_merge($slicesArray[$x],$slicesRemainderArray);
$slicesArray[$x] = $remainderItems;
$x++;
$z++;
}
}
};
return $slicesArray;
}
Вот результат разделения (оно как-то дублирует элементы из исходного массива в меньшие массивы):
Array
(
[0] => Array
(
[0] => stdClass Object
(
[bid] => 57
[name] => Southern Suburbs Physiotherapy Centre
[imageurl] => sp_sspc.jpg
[clickurl] => http://www.sspc.com.au
)
[1] => stdClass Object
(
[bid] => 35
[name] => Bendigo Bank Parkdale / Mentone East
[imageurl] => sp_bendigo.gif
[clickurl] => http://www.bendigobank.com.au
)
[2] => stdClass Object
(
[bid] => 38
[name] => Lowe Financial Group
[imageurl] => sp_lowe.gif
[clickurl] => http://lowefinancial.com/
)
[3] => stdClass Object
(
[bid] => 39
[name] => Main Street Mordialloc
[imageurl] => main street cafe.jpg
[clickurl] =>
)
[4] => stdClass Object
(
[bid] => 48
[name] => Beachside Osteo
[imageurl] => sp_beachside.gif
[clickurl] => http://www.beachsideosteo.com.au/
)
[5] => stdClass Object
(
[bid] => 33
[name] => Two Brothers
[imageurl] => sp_2brothers.gif
[clickurl] => http://www.2brothers.com.au/
)
[6] => stdClass Object
(
[bid] => 40
[name] => Ripponlea Mitsubishi
[imageurl] => sp_mitsubishi.gif
[clickurl] =>
)
)
[1] => Array
(
[0] => stdClass Object
(
[bid] => 44
[name] => Mordialloc Personal Trainers
[imageurl] => sp_mordipt.gif
[clickurl] => #
)
[1] => stdClass Object
(
[bid] => 41
[name] => Print House Graphics
[imageurl] => sp_printhouse.gif
[clickurl] =>
)
[2] => stdClass Object
(
[bid] => 39
[name] => Main Street Mordialloc
[imageurl] => main street cafe.jpg
[clickurl] =>
)
[3] => stdClass Object
(
[bid] => 48
[name] => Beachside Osteo
[imageurl] => sp_beachside.gif
[clickurl] => http://www.beachsideosteo.com.au/
)
[4] => stdClass Object
(
[bid] => 33
[name] => Two Brothers
[imageurl] => sp_2brothers.gif
[clickurl] => http://www.2brothers.com.au/
)
[5] => stdClass Object
(
[bid] => 40
[name] => Ripponlea Mitsubishi
[imageurl] => sp_mitsubishi.gif
[clickurl] =>
)
)
[2] => Array
(
[0] => stdClass Object
(
[bid] => 56
[name] => Logical Services
[imageurl] => sp_logical.jpg
[clickurl] =>
)
[1] => stdClass Object
(
[bid] => 43
[name] => Systema
[imageurl] => sp_systema.gif
[clickurl] =>
)
[2] => stdClass Object
(
[bid] => 48
[name] => Beachside Osteo
[imageurl] => sp_beachside.gif
[clickurl] => http://www.beachsideosteo.com.au/
)
[3] => stdClass Object
(
[bid] => 33
[name] => Two Brothers
[imageurl] => sp_2brothers.gif
[clickurl] => http://www.2brothers.com.au/
)
[4] => stdClass Object
(
[bid] => 40
[name] => Ripponlea Mitsubishi
[imageurl] => sp_mitsubishi.gif
[clickurl] =>
)
)
[3] => Array
(
[0] => stdClass Object
(
[bid] => 53
[name] => Carmotive
[imageurl] => sp_carmotive.jpg
[clickurl] => http://www.carmotive.com.au/
)
[1] => stdClass Object
(
[bid] => 45
[name] => Mordialloc Sporting Club
[imageurl] => msc logo.jpg
[clickurl] =>
)
[2] => stdClass Object
(
[bid] => 33
[name] => Two Brothers
[imageurl] => sp_2brothers.gif
[clickurl] => http://www.2brothers.com.au/
)
[3] => stdClass Object
(
[bid] => 40
[name] => Ripponlea Mitsubishi
[imageurl] => sp_mitsubishi.gif
[clickurl] =>
)
)
[4] => Array
(
[0] => stdClass Object
(
[bid] => 59
[name] => Pure Sport
[imageurl] => sp_psport.jpg
[clickurl] => http://www.puresport.com.au/
)
[1] => stdClass Object
(
[bid] => 54
[name] => PPM Builders
[imageurl] => sp_ppm.jpg
[clickurl] => http://www.hotfrog.com.au/Companies/P-P-M-Builders
)
[2] => stdClass Object
(
[bid] => 40
[name] => Ripponlea Mitsubishi
[imageurl] => sp_mitsubishi.gif
[clickurl] =>
)
)
[5] => Array
(
[0] => stdClass Object
(
[bid] => 46
[name] => Patterson Securities
[imageurl] => cmyk patersons_withtag.jpg
[clickurl] =>
)
[1] => stdClass Object
(
[bid] => 34
[name] => Adriano's Pizza & Pasta
[imageurl] => sp_adrian.gif
[clickurl] => #
)
)
[6] => Array
(
[0] => stdClass Object
(
[bid] => 55
[name] => 360South
[imageurl] => sp_360.jpg
[clickurl] =>
)
[1] => stdClass Object
(
[bid] => 37
[name] => Mordialloc Cellar Door
[imageurl] => sp_cellardoor.gif
[clickurl] =>
)
)
[7] => Array
(
[0] => stdClass Object
(
[bid] => 49
[name] => Kim Reed Conveyancing
[imageurl] => sp_kimreed.jpg
[clickurl] =>
)
[1] => stdClass Object
(
[bid] => 58
[name] => Dicount Lollie Shop
[imageurl] => new dls logo.jpg
[clickurl] =>
)
)
[8] => Array
(
[0] => stdClass Object
(
[bid] => 51
[name] => Richmond and Bennison
[imageurl] => sp_richmond.jpg
[clickurl] => http://www.richbenn.com.au/
)
[1] => stdClass Object
(
[bid] => 52
[name] => Mordialloc Travel and Cruise
[imageurl] => sp_morditravel.jpg
[clickurl] => http://www.yellowpages.com.au/vic/mordialloc/mordialloc-travel-cruise-13492525-listing.html
)
)
[9] => Array
(
[0] => stdClass Object
(
[bid] => 50
[name] => Letec
[imageurl] => sp_letec.jpg
[clickurl] => www.letec.biz
)
[1] => stdClass Object
(
[bid] => 36
[name] => Big River
[imageurl] => sp_bigriver.gif
[clickurl] =>
)
)
)
^^ Как вы можете видеть, есть дубликаты из исходного массива во вновь созданных меньших массивах.
Я думал, что смогу удалить дубликаты, используя многомерную функцию удаления дубликатов, но это не сработало. Я предполагаю, что моя проблема в функции array_split.
Какие-либо предложения?:)
8 ответов
РЕДАКТИРОВАТЬ: есть array_chunk, который делает именно это.
Ну, мне не хотелось отлаживать, поэтому я написал версию с array_reduce:
$pergroup = 2;
$redfunc = function ($partial, $elem) use ($pergroup) {
$groupCount = count($partial);
if ($groupCount == 0 || count(end($partial)) == $pergroup)
$partial[] = array($elem);
else
$partial[$groupCount-1][] = $elem;
return $partial;
};
$arr = array(1,2,3,4,5);
print_r(array_reduce($arr, $redfunc, array()));
дает
Array
(
[0] => Array
(
[0] => 1
[1] => 2
)
[1] => Array
(
[0] => 3
[1] => 4
)
[2] => Array
(
[0] => 5
)
)
array_chunk
не заполняет массивы равномерно, если общее количество элементов не делится на количество фрагментов, которое вы хотите; последний блок может быть намного меньше первого (например, если у вас есть семь элементов и вы разбили на три блока, вы получите массивы, содержащие три, три и один элемент).
Следующая реализация попытается сгладить это так, чтобы размеры массива были больше, даже если это то, что вам нужно, например, если у вас есть семь элементов, вы получите массивы чанков, содержащие три, два и два элемента. Это все еще не даже, но это более равномерно. Возвращается к использованию array_chunk
если количество делится на число столбцов равномерно, так как это будет быстрее (особенно если у вас большие массивы).
<?php
function array_group($array, $num)
{
$num = (int) $num;
if ($num < 1) {
throw new \InvalidArgumentException('At least one group must be returned.');
}
$count = count($array);
if ($count && $count % $num === 0) {
return array_chunk($array, $count / $num);
}
$groups = [];
$offset = 0;
do {
$length = ceil(($count - $offset) / $num);
$groups[] = array_slice($array, $offset, $length);
$offset += $length;
} while (--$num);
return $groups;
}
print_r(array_chunk(array(1, 2, 3, 4, 5, 6, 7), 3));
/* Produces
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[1] => Array
(
[0] => 4
[1] => 5
[2] => 6
)
[2] => Array
(
[0] => 7
)
) */
print_r(array_group(array(1, 2, 3, 4, 5, 6, 7), 3));
/* Produces
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[1] => Array
(
[0] => 4
[1] => 5
)
[2] => Array
(
[0] => 6
[1] => 7
)
) */
Мне кажется, что распределение оставшихся предметов слишком сложно.
Если вы знаете, сколько предметов не хватает ($Remainder
), почему бы вам просто не сгенерировать оставшийся срез и всплывающие элементы с array_pop()
пока не пусто?
Кстати, вы можете использовать эту процедуру для всего массива.
Есть array_chunk, которая делает именно это.
http://www.php.net/manual/en/function.array-chunk.php
[просто делая существенную часть ответа Артефакто более явной]
function split_array(&$array, $slices) {
$result = array();
$l = count($array)-1;
for ($i=0; $i<=$l; $i++) {
if ($i == 0 || $i % $slices == 0) $tmp = array();
$tmp[] = $array[$i];
if ($i == $l || $i % $slices == 1) $result[] = $tmp;
}
return $result;
}
Это простой способ разделить массив php на две равные части. и вы можете получить все элементы и значения обоих массивов, используя foreach easyity
list($firstarray, $secondarray) = array_chunk($vorstand_two_column, ceil(count($all_array_contents) / 2));
foreach($firstarray as $fa) {
.... Code ....
}
foreach($secondarray as $sa) {
.... Code ....
}
Попробуйте это простое использование. Когда он находит пустую строку, он разбивает массив на два массива. Один с самого начала пустого строкового индекса. Другое от пустого строкового индекса до последнего.
Примечание: строка Emty не включена в оба. он используется только для проверки состояния.
$column[] = "id";
$column[] = "name";
$column[] = "email";
$column[] = "password";
$column[] = "";
$column[] = "uid";
$column[] = "uname";
$column[] = "mname";
$column[] = "lname";
$column[] = "city";
$column[] = "country";
$column[] = "zip";
$column[] = "cell";
$column[] = "address";
split_array($column);
function split_array($column)
{
$total = count($column);
$num = array_search('',$column);
$split = $total - $num ;
$outer_sql = array_slice( $column , - ($split) + 1);
array_splice($column , $num);
echo "<pre>";
print_r($outer_sql);
echo "</pre>";
echo "<pre>";
print_r($column);
echo "</pre>";
}