【问题标题】:Creating binary based on recurring ID within an array根据数组中的重复 ID 创建二进制文件
【发布时间】:2020-01-07 16:41:32
【问题描述】:

我有一个 image_ID 数组,其中一些会重复出现。我想将这些与彩色行分组(我使用粗体只是为了查看效果)。我不能使用奇数/偶数,因为 image_id 可能在偶数旁边。这是一个示例数组;

数组 (1 => 9681 2 => 9681 [3] => 9681 [4] => 8351 [5] => 8351 [6] => 8351 [7] => 2320 [8] => 2320 [9] => 2320 [10] => 2320 [11] => 2320 [12] => 20711 [13] => 20711 [14] => 20711 [15] => 20711 [16] => 5223 [17] => 5223 [18] => 5223 [19] => 5223 [20] => 5223 )

我们的想法是 9681s 将是一种颜色,然后 8351s 将是另一种颜色,然后 2320s 可以重新启动与 9681s 相同的颜色。创建每个图像的可见分组(基于 image_ID)。 Image _ID 是唯一可用于对图像进行分组的东西。

所以问题的症结在于如何将事物分组到列表或数组中(如果我必须在它们之间进行转换,我可以)并将交替格式应用于每个组。如果该交替格式是适合我的二进制格式,那么上面将是“11100011111000011111”,因为我可以在循环中使用它来应用带有一些样式的 if...else 循环。

我试过了 如果 ($image_id & 2) { ...应用粗体 } 别的 { ...不要粗体 }

//感谢@kainaw,这是我最终使用的代码

// Create a binary pattern to match occurrence of image_id for visually grouping later 
// Create a new array to count the values then make the count the keys
$output_result_array['bin_group'] = array_flip(array_count_values($output_result_array['source']));
// Setup temp variables
$c = false;
$l = null;
// Loop though the counted and flipped array creating a binary representation of groups.    
foreach($output_result_array['source'] as $k=>$v) {
   if($v != $l) $c = !$c;
   $output_result_array['bin_group'][$k] = $c;
   $l = $v;
}
// START add different row colouring based on Image_id groups represented in BIN        
if ($output_result_array['bin_group'][$x]) {
$output_result .= '<tr class="post bg2;">';
}   else {
$output_result .= '<tr>';
}
// END add different row colouring  

【问题讨论】:

  • 根据您的描述,您不能使用 2 种颜色。我将使用字母来使这更简单。假设我有ABCA。 A是一种颜色。 B是另一个。 C 回到 A 的颜色。然后,我又A了。我不能使用 A 的颜色,除非您可以保证 A 以后不会出现,例如在执行此操作之前对列表进行排序。
  • 如果你的数组ID是有序的,所有的9681在一起,只要检测ID的变化,改变你的高亮状态。
  • @kainaw - 如果我有 AABCCCAAA = 我想要 = RED:RED:BLUE:RED:RED:RED:BLUE:BLUE:BLUE 如果另一个 A 出现也没关系,我的想法是仅在组之间进行视觉分组。
  • @Dave - 在 PHP 中我可以检测到更改,但不能检测到组。我对 kainaw 的回复可能会有所帮助。这个问题让我很头疼,它简单而复杂。我非常感谢任何人的帮助。
  • 添加了页面外观的屏幕截图。这个想法是地图是红色的,然后抬头看管!是蓝色然后一般视图我再次红色。 photos.app.goo.gl/Fw7CnRkHYjhuRY4v9

标签: php arrays binary


【解决方案1】:

您需要一个布尔数组。这很容易。我要做的是创建一个单独的数组。假设 $a 是您的数组。首先,创建一个新数组,其中键是 $a 的值:

$b = array_flip($a);

现在,$a 中的每个值都是 $b 中的键。 $b 中的值是每个值在 $a 中出现的次数的计数。我们不在乎。

下一步是替换布尔值。从它开始等于你不想开始的任何东西。然后,每次使用时倒过来。

$c = false;
foreach($b as $k=>$v) $b[$k] = $c = !$c;

你设置 $c 等于 $c 的否定。该新值被传递到二进制数组中。您最终会得到一个数组,其中每个键都是您的原始值,每个值都是交替的布尔值。

你如何使用它?考虑一下。我的原始数组是 $a 而 $b 是我的布尔数组。

foreach($a as $v) {
  if($b[$v]) print "$v is true.\n";
  else print "$v is false.\n";
}

如果您只需要一个布尔数组而不是这个。这也很容易做到。同样,假设您的原始数组是 $a,新的布尔数组是 $b。关键是存储最后看到的值。

$b = array();
$c = false;
$l = null;
foreach($a as $k=>$v) {
  if($v != $l) $c = !$c;
  $b[$k] = $c;
  $l = $v;
}

每次上一个值与新值不匹配时,布尔值都会翻转。

【讨论】:

  • 哇,你这聪明的猪! ;) 非常感谢,我已经将它融入我的代码中,我希望我能在这里展示我的工作,但是有一个字符限制..
猜你喜欢
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多