sud*_*udh 39 php arrays duplicates
如何让php数组有重复键?当我尝试插入一个键,具有已存在键的值对时,它会用新值覆盖相应前一个键的值.有没有办法可以维护两个具有不同值的重复键?
Mik*_*wis 56
您可以拥有一个具有数组值(也称为多维数组)的键,该键包含具有该给定键的所有元素.一个例子可能是
$countries = array(
"United States" => array("California", "Texas"),
"Canada" => array("Ontario", "Quebec")
);
Run Code Online (Sandbox Code Playgroud)
Mat*_*hew 30
$array[$key][] = $value;
Run Code Online (Sandbox Code Playgroud)
然后通过以下方式访问它:
echo $array[$key][0];
echo $array[$key][1];
Run Code Online (Sandbox Code Playgroud)
等等.
请注意,您正在使用此方法创建数组数组.
Kor*_*nel 13
数组的重点是拥有唯一的键.如果要存储值对,则:
$array[] = [$value1, $value2];
Run Code Online (Sandbox Code Playgroud)
如果你有很多欺骗,那么这种替代方案将更有效:
<?php
if (array_key_exists($key, $array))
$array[$key]['occurrences']++;
else
$array[$key] = ['value'=>$value, 'occurrences'=>1];
Run Code Online (Sandbox Code Playgroud)
PHP不允许这样做.最好的解决方案是使用多维数组.例如...
<?php
$mArray = array(array("key1" => "value1"),
array("key2" => "value2"),
array("key3" => "value3"),
array("key1" => "value4"));
?>
Run Code Online (Sandbox Code Playgroud)
请注意我是如何重命名的键key1.
现在,如果我想调用每个实例key1,运行
<?php
$desiredKeyName = "key1";
foreach ($mArray as $aValue) {
foreach ($aValue as $key => $value) {
if ($key == $desiredKeyName) {
echo $value . "<br />";
}
}
}
?>
Run Code Online (Sandbox Code Playgroud)
它会回来的
value1
value4
Run Code Online (Sandbox Code Playgroud)
我告诉你:归档阵列
样品用法.
<?php
$arch = new archiveArray(); //Class setup
// Set and overwrite the data few times
$arch -> data = 'one';
$arch -> data = 2;
$arch -> data = 'tree XD';
// Get the latest data, as per expected behaviour of an array object
var_dump( $arch -> data ); // 'tree XD'
// Get its previously set archived values
var_dump( $arch -> getArchived( 'data' ) ); // ['one', 2]
?>
Run Code Online (Sandbox Code Playgroud)
班级代码
<?php
///
/// An object array, which keeps an archived copy
/// of all its previously set values.
///
/// @author eugene@picoded.com
///
class archiveArray {
public $arch_data = array();
public $arch_archive = array();
public function archiveArray() {
$arch_data = array();
$arch_archive = array();
}
public function setData($name, $value) {
if( array_key_exists( $name, $this -> arch_data ) ) {
if( !array_key_exists( $name, $this -> arch_archive ) ) {
$this -> arch_archive[ $name ] = array();
} else {
if( !is_array($this -> arch_archive[ $name ] ) ) {
$this -> arch_archive[ $name ] = array();
}
}
array_push( $this -> arch_archive[ $name ] , $this -> arch_data[ $name ] );
}
$this -> arch_data[ $name ] = $value;
}
public function getData($name) {
return $this -> arch_data[ $name ];
}
public function getArchived($name) {
if( array_key_exists( $name, $this -> arch_archive ) ) {
return $this -> arch_archive[ $name ];
}
return null;
}
//!!!--- OVERLOAD functionalities START ---!!!//
public function __set($name, $value) { //Uses the 'set' to create a node in the default type setting
$this -> setData($name, $value);
}
public function __get($name) {
return $this -> getData($name);
}
//!!!--- OVERLOAD functionalities END ---!!!//
}
?>
Run Code Online (Sandbox Code Playgroud)
TLDR:有时你需要像这样的黑客来快速完成工作!
他的问题可能引起强烈争议,并且违背了计算机科学的教义.(在拍摄之前,请阅读整篇文章)但有些情况下您希望这种情况发生.= X
例如,您有一个代码库,它操作一组指定的数组对象.并且由于它的重复使用(循环?,递归?).它会覆盖或重新定义结果.直到最后一组给出.
当你完成所有事情的时候.您突然意识到您的客户(或您的)规格发生了变化.您需要中间的每个数据(而不是最终数据)(因此每个键需要多于1个数据).在不幸的情况下,你的系统已经以如此复杂的方式完成了,很容易让!@#$改变一切,以便轻松地使用多维数组(意味着替换不起作用,特别是如果你正在使用动态调用).那么你做什么> ??
这实际上是我最近遇到的一个场景,但是有一个简单的黑客攻击,它仍然可以确保所有代码仍然有效,同时仍保留旧数据.
最终结果,一个类仍然可以像任何其他对象一样对待.但是获得了存档能力,以保留旧数据.它排序一个多维数组,直接访问[0]索引.它只需通过使用此对象更改变量声明即可.对对象参数所做的任何更改都将被存档.为方便访问,整个代码程序中的变化很小或没有变化=)
小智 5
我在处理个人项目时想出了一个简单的解决方案。
因为我想要某种重复的键,所以我决定以相反的顺序存储我的数组 key=>values value=>key ,其中值成为键,键成为值,这样我就可以拥有重复的键,实际上它们是价值观。我没有创建重复的值,因此它适用于这种特定情况。
举个小例子:
$r = array ( 'banana'=>'FRUIT', 'apple'=>'FRUIT', 'broccoli'=>'VEG', 'peas'=>'VEG' );
function get_food_group ( $type, $bowl ) {
return array_keys ( $bowl, $type );
}
print_r ( get_food_group('FRUIT', $r) );
# PRINTS #
# Array
# (
# [0] => banana
# [1] => apple
# )
Run Code Online (Sandbox Code Playgroud)
如果你会有类似的东西:
array (
'banana' => 'FRUIT',
'peach' => 'FRUIT',
'banana' => 'YELLOW'
)
Run Code Online (Sandbox Code Playgroud)
然后我会采用另一种解决方案。
| 归档时间: |
|
| 查看次数: |
77143 次 |
| 最近记录: |