Php 两个项目之间的差异)
打成平局时,来自较大团体的项目排在第一位 示例:合并Php 两个项目之间的差异),php,arrays,sorting,math,multidimensional-array,Php,Arrays,Sorting,Math,Multidimensional Array,打成平局时,来自较大团体的项目排在第一位 示例:合并AAAA和BB对于B-0.33,0.66,A的键将是0.2,0.4,0.6,0.8anf。结果将是 A(0.2), B(0.33), A(0.4), A(0.6), B(0.66), A(0.8) 测试: $testData = [ 'AAAAABBBCC', 'AAAAABBBCCC', 'ABBCCC', 'AAAAAABBC', 'AAAAAABBBBCCD', 'AAAAAAAAAABC
AAAA
和BB
对于B
-0.33,0.66
,A
的键将是0.2,0.4,0.6,0.8
anf。结果将是
A(0.2), B(0.33), A(0.4), A(0.6), B(0.66), A(0.8)
测试:
$testData = [
'AAAAABBBCC',
'AAAAABBBCCC',
'ABBCCC',
'AAAAAABBC',
'AAAAAABBBBCCD',
'AAAAAAAAAABC',
'hpp',
'stackoverflow',
'ACCD', // :-)
];
$results = [];
foreach ($testData as $dataStr) {
$a = str_split($dataStr);
$data = [];
foreach ($a as $type) {
$data[] = ['type' => $type];
}
$result = distribute($data);
$resultStr = implode(array_column($result, 'type'));
$results[$dataStr] = $resultStr;
}
var_export($results);
测试结果:
'AAAAABBBCC' => 'BACABACABA',
'AAAAABBBCCC' => 'CABACABACAB',
'ABBCCC' => 'BCACBC',
'AAAAAABBC' => 'ABAACAABA',
'AAAAAABBBBCCD' => 'BACABADABACAB',
'AAAAAAAAAABC' => 'AAACAAAABAAA',
'hpp' => 'php',
'stackoverflow' => 'sakeofwlrovct',
'ACCD' => 'ACDC',
测试演示:
您可以轻松地向演示添加更多测试用例
$data = array(
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "C"),
array( "name" => "SomeName", "type" => "C")
);
//make seperate arrays
echo "<pre>";
foreach($data as $val){
${$val["type"]}[]=$val["name"];
$types[]=$val['type'];
}
$types=array_unique($types);
//make ratio
foreach($types as $val){
$cnt[]=count($$val);
}
//find maximum from ratio
echo $max=max($cnt);
echo $min=min($cnt);
for($i=0;$i<$max;$i++){
foreach($types as $val){
if(isset($$val[$i])){
$new_array[]=array("name"=>$$val[$i],"type"=>$val);
}
}
}
print_r($new_array);
检查你想要的确切输出
<?php
$data = array(
array( "name" => "SomeName 1", "type" => "A"),
array( "name" => "SomeName 2", "type" => "A"),
array( "name" => "SomeName 3", "type" => "A"),
array( "name" => "SomeName 4", "type" => "A"),
array( "name" => "SomeName 5", "type" => "A"),
array( "name" => "SomeName 6", "type" => "B"),
array( "name" => "SomeName 7", "type" => "B"),
array( "name" => "SomeName 8", "type" => "B"),
array( "name" => "SomeName 9", "type" => "C"),
array( "name" => "SomeName 10", "type" => "C")
);
$result = array();
$typeArr = array();
$countArr = array();
$ratioArr = array();
foreach($data as $t){
$typeArr[$t['type']][] = $t;
$countArr[$t['type']] = count($typeArr[$t['type']]);
$ratioArr[$t['type']] = $countArr[$t['type']]/ count($data);
}
arsort($countArr);
$countArrIndex = array_keys($countArr);
$maxKeyCount = 0 ;$exceptMaxKey = 1;
$exceptMaxKeyCount=0;
for($i = 0; $i<count($data); $i++){
if($i%2 != 0 ){
$result[$i] = $typeArr[$countArrIndex[$exceptMaxKey]][$exceptMaxKeyCount];
if($exceptMaxKey == (count($typeArr)-1)){
$exceptMaxKey = 1;
$exceptMaxKeyCount++;
}else{
$exceptMaxKey++;
}
}else{
$result[$i] = $typeArr[$countArrIndex[0]][$maxKeyCount];
$maxKeyCount ++;
}
}
echo "<pre>";
print_r($result);
$countArr['total'] = count($data);
print_r($countArr);
print_r($ratioArr);
$data=array(
数组(“name”=>“SomeName”,“type”=>“A”),
数组(“name”=>“SomeName1”,“type”=>“A”),
数组(“name”=>“SomeName2”,“type”=>“A”),
数组(“name”=>“SomeName3”,“type”=>“A”),
数组(“name”=>“SomeName4”,“type”=>“A”),
数组(“name”=>“SomeName5”,“type”=>“B”),
数组(“name”=>“SomeName6”,“type”=>“B”),
数组(“name”=>“SomeName7”,“type”=>“B”),
数组(“name”=>“SomeName8”,“type”=>“C”),
数组(“name”=>“SomeName9”,“type”=>“C”),
);
//得到所有计数
$type=[];
foreach($key=>$value形式的数据){
if(空($type)| |$type!=$value['type'])){
$type=$value['type'];
$counter=0;
}
$temp[$value['type']]=++$counter;
}
/**
*多值数组搜索
*
*@param数组$parents输入数组
*@param array$搜索数组
*
*@return找到的项目的int键
*/
函数多维搜索($parents,$searched)
{
if(空($searched)| |空($parents)){
返回false;
}
foreach($key=>$value的父对象){
$exists=true;
foreach($skey=>$svalue){
$exists=($exists&&isset($parents[$key][$skey])&&$parents[$key][$skey]==$svalue);
}
如果($exists){返回$key;}
}
返回false;
}
$output_array=[];
$first_值=当前($temp);
$first_key=key($temp);
$flag=0;
$junkar=array_column($data,'type,'name');
$memory_me=0;
$incr=0;
完(临时);;
$end_item=键($temp);
重置($temp);
$memory_index=0;
对于($i=0;$ikey($junkar),'type'=>current($junkar)]);
如果($temp[$first_key]>0){
$temp[$first\u key]=--$first\u值;
}
$direction=(空($direction)| |$direction=='reverse'?“forward”:“reverse”);
对于($k=0;$k您可以这样使用
// split data into arrays of distinct type
$buckets = array_reduce($data, function($result, $item) {
$type = $item["type"];
if (!isset($result[$type])) {
$result[$type] = [];
}
array_push($result[$type], $item);
return $result;
}, []);
// sort buckets by size
usort($buckets, function($a, $b) {
return count($b) - count($a);
});
// merge buckets to single array sorted by type
// and split to chunks of size of the largest bucket
$table = array_chunk(array_merge(...$buckets), count($buckets[0]));
// compute final array by merging each column
$result = [];
foreach (array_keys($table[0]) as $i) {
$result = array_merge($result, array_column($table, $i));
}
以下是基于以下理念的另一个实现:
.我不确定我的脚本使用方法是否正确,请检查一下
谢谢:)OMG这里有这么多巨大的功能
请求的ABAC ABAC…
完成:
测试:
你的问题是按比率排序?还是洗牌数组?让我把它写下来回答……如果‘abac’也适用于你,你可以尝试像‘从最大的堆中挑选一个,不同于上次挑选’这样的规则。这个问题需要更高的精度。在问题中,它说“如果可能,重复类型最少”在评论中,你喜欢以重复的模式为代价来获得重复的模式。你应该在一个问题上澄清你认为最好的解决方案,消除所有的歧义。检查答案并给出一些反馈。伊凡,也许我错过了一些东西,但是你的解决方案显示了倍增<代码> A <代码>。如果我们增加它们的数量,d将显示更多。作者的评论是,abcabcaa会更好,因为重复模式更长。
。看起来模式的长度比双a更重要。如果计数(maxtype)
计数(nexttype),则会发生加倍+1
。目前还不清楚,合适的意图是什么。非常感谢。这非常有效!对于最初的混淆,非常抱歉。就快到了:}
$data = array(
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "B"),
);
$distributed_data = array();
$counts = array();
$size = sizeof($data);
// Count values
foreach ($data as $entry) {
$counts[$entry["type"]] = isset($counts[$entry["type"]]) ? $counts[$entry["type"]] + 1 : 1;
}
// Set counter
for ($i = 0; $i < $size; $i++) {
$data[$i]["count"] = $counts[$data[$i]["type"]];
}
// Sort by count
usort($data, function($entry1, $entry2) {
return $entry2["count"] <=> $entry1["count"];
});
// Generate the distributed array
$max_length = $data[0]["count"];
$rows = ceil($size / $max_length);
$last_row = ($size - 1) % $max_length + 1;
$row_cycle = $rows;
$row = 0;
$col = 0;
for ($i = 0; $i < $size; $i++) {
if ($i == $rows * $last_row) {
$row_cycle -= 1;
}
$distributed_data[$i] = $data[$row * $max_length + $col];
$row = ($row + 1) % $row_cycle;
if ($row == 0) {
$col++;
}
}
function distribute($data) {
$groups = [];
foreach ($data as $row) {
$groups[$row['type']][] = $row;
}
$groupSizes = array_map('count', $groups);
asort($groupSizes);
$result = [];
foreach ($groupSizes as $type => $groupSize) {
if (count($result) == 0) {
$result = $groups[$type];
} elseif (count($result) >= count($groups[$type])) {
$result = merge($result, $groups[$type]);
} else {
$result = merge($groups[$type], $result);
}
}
return $result;
}
function merge($a, $b) {
$c1 = count($a);
$c2 = count($b);
$result = [];
$i1 = $i2 = 0;
while ($i1 < $c1) {
$result[] = $a[$i1++];
while ($i2 < $c2 && ($i2+1)/($c2+1) < ($i1+1)/($c1+1)) {
$result[] = $b[$i2++];
}
}
return $result;
}
while ($i2 < $c2 && ($i2+1)/($c2+1) < ($i1+1)/($c1+1))
floatKey = (index + 1) / (groupSize + 1)
A(0.2), B(0.33), A(0.4), A(0.6), B(0.66), A(0.8)
$testData = [
'AAAAABBBCC',
'AAAAABBBCCC',
'ABBCCC',
'AAAAAABBC',
'AAAAAABBBBCCD',
'AAAAAAAAAABC',
'hpp',
'stackoverflow',
'ACCD', // :-)
];
$results = [];
foreach ($testData as $dataStr) {
$a = str_split($dataStr);
$data = [];
foreach ($a as $type) {
$data[] = ['type' => $type];
}
$result = distribute($data);
$resultStr = implode(array_column($result, 'type'));
$results[$dataStr] = $resultStr;
}
var_export($results);
'AAAAABBBCC' => 'BACABACABA',
'AAAAABBBCCC' => 'CABACABACAB',
'ABBCCC' => 'BCACBC',
'AAAAAABBC' => 'ABAACAABA',
'AAAAAABBBBCCD' => 'BACABADABACAB',
'AAAAAAAAAABC' => 'AAACAAAABAAA',
'hpp' => 'php',
'stackoverflow' => 'sakeofwlrovct',
'ACCD' => 'ACDC',
$data = array(
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "C"),
array( "name" => "SomeName", "type" => "C")
);
//make seperate arrays
echo "<pre>";
foreach($data as $val){
${$val["type"]}[]=$val["name"];
$types[]=$val['type'];
}
$types=array_unique($types);
//make ratio
foreach($types as $val){
$cnt[]=count($$val);
}
//find maximum from ratio
echo $max=max($cnt);
echo $min=min($cnt);
for($i=0;$i<$max;$i++){
foreach($types as $val){
if(isset($$val[$i])){
$new_array[]=array("name"=>$$val[$i],"type"=>$val);
}
}
}
print_r($new_array);
- Step 1: Make separate array
- Step 2: Count all array and find out the ratio
- Step 3: Iterate with array with maximum ratio value
- Step 4: Make array with same index together and merge them in multidimensional
array
$data = array(
array("name" => "SomeName", "type" => "A"),
array("name" => "SomeName1", "type" => "A"),
array("name" => "SomeName2", "type" => "A"),
array("name" => "SomeName3", "type" => "A"),
array("name" => "SomeName4", "type" => "A"),
array("name" => "SomeName5", "type" => "B"),
array("name" => "SomeName6", "type" => "B"),
array("name" => "SomeName7", "type" => "B"),
array("name" => "SomeName8", "type" => "C"),
array("name" => "SomeName9", "type" => "C"),
);
// getting all counts
$type = [];
foreach ($data as $key => $value) {
if (empty($type) || $type != $value['type']) {
$type = $value['type'];
$counter = 0;
}
$temp[$value['type']] = ++$counter;
}
/**
* array search with multiple values
*
* @param array $parents input array
* @param array $searched search array
*
* @return int key of found items
*/
function multidimensional_search($parents, $searched)
{
if (empty($searched) || empty($parents)) {
return false;
}
foreach ($parents as $key => $value) {
$exists = true;
foreach ($searched as $skey => $svalue) {
$exists = ($exists && isset($parents[$key][$skey]) && $parents[$key][$skey] == $svalue);
}
if ($exists) {return $key;}
}
return false;
}
$output_array = [];
$first_value = current($temp);
$first_key = key($temp);
$flag = 0;
$junkArr = array_column($data, 'type', 'name');
$remember_me = 0;
$incr = 0;
end($temp);
$end_item = key($temp);
reset($temp);
$remember_index = 0;
for ($i = 0; $i < count($data); $i++) {
$output_array[] = $data[multidimensional_search($data, ['name' => key($junkArr), 'type' => current($junkArr)])];
if ($temp[$first_key] > 0) {
$temp[$first_key] = --$first_value;
}
$direction = (empty($direction) || $direction == 'reverse' ? "forward" : "reverse");
for ($k = 0; $k <= $remember_me; $k++) {
if ($direction == 'forward') {
next($temp);
} else {
prev($temp);
if ($k == 0) {
$incr = $remember_me + 1;
}
}
}
$remember_me = $incr;
if ($remember_me == count($temp) - 1) {
$remember_me = 0;
}
$first_key = key($temp);
$first_value = current($temp);
if (in_array($first_key, $junkArr)) {
$saved_key = key($junkArr);
reset($junkArr);
while ($first_key !== current($junkArr)) {
next($junkArr);
}
unset($junkArr[$saved_key]);
}
}
pr($output_array);
die;
<?php
$data = array(
array( "name" => "SomeName 1", "type" => "A"),
array( "name" => "SomeName 2", "type" => "A"),
array( "name" => "SomeName 3", "type" => "A"),
array( "name" => "SomeName 4", "type" => "A"),
array( "name" => "SomeName 5", "type" => "A"),
array( "name" => "SomeName 6", "type" => "B"),
array( "name" => "SomeName 7", "type" => "B"),
array( "name" => "SomeName 8", "type" => "B"),
array( "name" => "SomeName 9", "type" => "C"),
array( "name" => "SomeName 10", "type" => "C")
);
$result = array();
$typeArr = array();
$countArr = array();
$ratioArr = array();
foreach($data as $t){
$typeArr[$t['type']][] = $t;
$countArr[$t['type']] = count($typeArr[$t['type']]);
$ratioArr[$t['type']] = $countArr[$t['type']]/ count($data);
}
arsort($countArr);
$countArrIndex = array_keys($countArr);
$maxKeyCount = 0 ;$exceptMaxKey = 1;
$exceptMaxKeyCount=0;
for($i = 0; $i<count($data); $i++){
if($i%2 != 0 ){
$result[$i] = $typeArr[$countArrIndex[$exceptMaxKey]][$exceptMaxKeyCount];
if($exceptMaxKey == (count($typeArr)-1)){
$exceptMaxKey = 1;
$exceptMaxKeyCount++;
}else{
$exceptMaxKey++;
}
}else{
$result[$i] = $typeArr[$countArrIndex[0]][$maxKeyCount];
$maxKeyCount ++;
}
}
echo "<pre>";
print_r($result);
$countArr['total'] = count($data);
print_r($countArr);
print_r($ratioArr);
// split data into arrays of distinct type
$buckets = array_reduce($data, function($result, $item) {
$type = $item["type"];
if (!isset($result[$type])) {
$result[$type] = [];
}
array_push($result[$type], $item);
return $result;
}, []);
// sort buckets by size
usort($buckets, function($a, $b) {
return count($b) - count($a);
});
// merge buckets to single array sorted by type
// and split to chunks of size of the largest bucket
$table = array_chunk(array_merge(...$buckets), count($buckets[0]));
// compute final array by merging each column
$result = [];
foreach (array_keys($table[0]) as $i) {
$result = array_merge($result, array_column($table, $i));
}
<?php
/* multidimensional array */
$data = array(
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "C"),
array( "name" => "SomeName", "type" => "C")
);
/* Assign blank arrays for further use */
$a_array = $b_array = $c_array = $returnArray = array();
$count = count($data); // count array
$x = $y = $z = $m = $a = $b = $c = 0; // assiging variable with value 0
for($i = 0; $i < $count; $i++)
{
if($data[$i]['type'] == "A")
{
$a_array[$x]["name"] = $data[$i]["name"];
$a_array[$x]["type"] = $data[$i]["type"];
$x++ ;
}
elseif($data[$i]['type'] == "B")
{
$b_array[$y]["name"] = $data[$i]["name"];
$b_array[$y]["type"] = $data[$i]["type"];
$y++ ;
}
elseif($data[$i]['type'] == "C")
{
$c_array[$z]["name"] = $data[$i]["name"];
$c_array[$z]["type"] = $data[$i]["type"];
$z++ ;
}
}
for($j = 0; $j < $count; $j++)
{
if($j == 0 || $j % 2 == 0)
{
$returnArray[$m]["name"] = $a_array[$a]["name"];
$returnArray[$m]["type"] = $a_array[$a]["type"];
$a++ ;
}
else
{
if($j == 3 || $j == 7)
{
$returnArray[$m]["name"] = $c_array[$c]["name"];
$returnArray[$m]["type"] = $c_array[$c]["type"];
$c++ ;
}
else
{
$returnArray[$m]["name"] = $b_array[$b]["name"];
$returnArray[$m]["type"] = $b_array[$b]["type"];
$b++ ;
}
}
$m++ ;
}
echo "<pre>";
print_R($returnArray);
?>
function sortTypes(array $data, array $types)
{
$result = [];
while (!empty($data)) {
$currentType = current($types);
if (!next($types)) {
reset($types);
}
foreach ($data as $key => $array) {
if ($array['type'] === $currentType) {
$result[$key] = $array;
unset($data[$key]);
break;
}
}
}
return $result;
}
$types = ['A', 'B', 'A', 'C']; // gets sorted by this pattern
$result = sortTypes($data, $types);
var_export($result);
// OUT:
[
0 => [
'name' => 'SomeName',
'type' => 'A',
],
5 => [
'name' => 'SomeName',
'type' => 'B',
],
1 => [
'name' => 'SomeName',
'type' => 'A',
],
8 => [
'name' => 'SomeName',
'type' => 'C',
],
2 => [
'name' => 'SomeName',
'type' => 'A',
],
6 => [
'name' => 'SomeName',
'type' => 'B',
],
3 => [
'name' => 'SomeName',
'type' => 'A',
],
9 => [
'name' => 'SomeName',
'type' => 'C',
],
4 => [
'name' => 'SomeName',
'type' => 'A',
],
7 => [
'name' => 'SomeName',
'type' => 'B',
],
]