如何在php数组中允许重复键

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)

  • @MoDarwish 你这样做:`$countries["United States"][] = "Your value";` (3认同)
  • 我如何向美国的数组中插入一个值..? (2认同)

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)

等等.

请注意,您正在使用此方法创建数组数组.

  • 是的,在这种情况下,不会生成任何通知. (3认同)
  • 在执行`$ array [$ key] []`之前,请确保通过`if(!isset($ array [$ key]))$ array [$ key] = array();`创建了一个数组. (2认同)
  • @isra:没必要这样做.php自己做;;) (2认同)

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)


Ste*_*ins 7

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)


Pic*_*tor 5

我告诉你:归档阵列

样品用法.

<?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)

然后我会采用另一种解决方案。