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

||                                                                                                                   这个问题已经在这里有了答案:                                                      
已邀请:
        您可能只有一个键,其值为数组(也称为多维数组),其中将包含具有该给定键的所有元素。一个例子可能是
$countries = array(
  \"United States\" => array(\"California\", \"Texas\"),
  \"Canada\" => array(\"Ontario\", \"Quebec\")
);
    
        
$array[$key][] = $value;
然后,您可以通过以下方式访问它:
echo $array[$key][0];
echo $array[$key][1];
等等。 请注意,您正在使用此方法创建数组数组。     
        数组的重点是拥有唯一的键。如果要存储值对,则:
$array[] = [$value1, $value2];
如果您有很多骗子,那么这种替代方法会更有效:
<?php

if (array_key_exists($key, $array)) 
    $array[$key][\'occurrences\']++; 
else 
    $array[$key] = [\'value\'=>$value, \'occurrences\'=>1];
    
        PHP不允许这样做。最好的解决方案是使用多维数组。例如...
<?php

    $mArray = array(array(\"key1\" => \"value1\"),
                    array(\"key2\" => \"value2\"),
                    array(\"key3\" => \"value3\"),
                    array(\"key1\" => \"value4\"));

?>
请注意,我如何有重复的名为
key1
的键。 现在,如果我要调用
key1
的每个实例,请运行
<?php

    $desiredKeyName = \"key1\";

    foreach ($mArray as $aValue) {

        foreach ($aValue as $key => $value) {

            if ($key == $desiredKeyName) {

                echo $value . \"<br />\";
            }
        }
    }

?>
它将返回
value1
value4
    
        我向您介绍:存档数组 样本用法。
<?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]
?>
班级代码
<?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 ---!!!//
}
?>
TLDR:有时您需要这样的技巧来快速完成工作! 他的问题可能引起强烈争议,并且与计算机科学的教学背道而驰。 (在拍摄之前,请先阅读全文),但在某些情况下,您希望这种情况发生。 = X 例如,您有一个代码库,用于处理一组指定的数组对象。并且由于其重复使用(循环?,递归?)。它会覆盖或重新定义结果。直到给出最后一组。 当您完成所有工作时。您突然意识到客户(或您)的规格已更改。而不是最终数据,您希望每个数据都介于两者之间(因此每个键希望有1个以上的数据)。而且在不幸的情况下,您的系统已经以如此复杂的方式完成了,在!@#$中很难轻松地更改所有内容以使用多维数组(这意味着替换将不起作用,特别是如果您使用的是动态调用)。那你怎么办??? 这实际上是我最近遇到的一种情况,但是对此有一个简单的破解方法,它仍然可以确保所有代码仍然有效,同时仍保留旧数据。 最终结果是,仍然可以像其他任何对象一样对待的类。但是具有存档功能,可以保留旧数据。它排序多维数组,直接访问[0]索引。它只是通过更改此对象的变量声明来工作。对object参数所做的任何更改都将被存档。为了易于访问,整个代码程序的更改量很小或没有更改=)     
        在进行个人项目时,我想出了一个简单的解决方案。 由于我想要某种重复的键,因此我决定将数组键=>值以相反的顺序存储在值=>键中,其中value成为键,而键成为值,这样我就可以拥有实际上是价值观。我没有创建重复的值,因此在这种情况下可以使用。 举个例子:
$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
# )
如果您有类似以下内容:
array (
    \'banana\' => \'FRUIT\',
    \'peach\' => \'FRUIT\',
    \'banana\' => \'YELLOW\'
)
然后,我将采用另一种解决方案。     
        “您做不到”不是很多。当您实际尝试使用具有重复键的数组时,其不利之处显而易见。 您将失去单独处理内容的能力。对于“ 14”访问,您将只会看到第一个条目。 因此,实际上,您只能在
foreach
中使用此类对象,无论其含糊不清,它都能看到每个键/值对。 参见下文,您还必须决定如何处理未设置的尝试,或者是否可以完全覆盖条目。仅追加模式最容易实现。 (在这种情况下,这也许是合情合理的。) 无论如何,要对这个问题有一个完整的答案:您可以使用PHPs数组语法,但可以使用一个累积对象代替:
class DuplicateArray implements ArrayAccess, Iterator, Countable {

    var $keys = array(),
        $values = array();
    var $pointer = 0;

    // initialize from array
    function __construct($from=array()) {
        $this->keys = array_keys($from);
        $this->values = array_values($from);
    }

    // iteration
    function count() {
        return count($this->keys); 
    }
    function current() {
        return $this->values[$this->position];
    }
    function key() {
        return $this->keys[$this->position];
    }
    function next() {
        $this->position++;
    }
    function rewind() {
        $this->position = 0;
    }
    function valid() {
        return isset($this->keys[$this->position]);
    }

    // just fetches the first found entry
    function offsetGet($key) {
        if (($i = array_search($key, $this->keys)) !== FALSE) {
            return $this->values[$i];
        }
        else trigger_error(\"Undefined offset \'$key\'\", E_USER_NOTICE);
    }

    // will only append new entries, not overwrite existing
    function offsetSet($key, $value) {
        $this->keys[] = $key;
        $this->values[] = $value;
    }

    // removes first matching entry
    function offsetUnset($key) {
        if (($i = array_search($key, $this->keys)) !== FALSE) {
            unset($this->keys[$i]);
            unset($this->values[$i]);
            // keep entries continuos for iterator
            $this->keys = array_values($this->keys);
            $this->values = array_values($this->values);
        }
    }
    function offsetExists($key) {
        return array_search($key, $this->keys) !== FALSE;
    }
}
    
        正如porneL所说,数组的全部意义在于键是唯一的。 如果要引用数组中的多个条目,则需要搜索数组值。
  $arr=array(
     0=>array(\'date\'=>time(), \'ip\'=>\'127.0.0.1\', url=\'index.php\'),
     1=>array(\'date\'=>time(), \'ip\'=>\'192.168.1.2\', url=\'index.php\'),
     2=>array(\'date\'=>time(), \'ip\'=>\'127.0.0.1\', url=\'other.php\'));
  $matches=retrieve_keys_matching_subkey($arr, \'ip\', \'127.0.0.1\');
  foreach ($matches as $i) {
     print implode(\' \', $arr[$i]) . \"\\n\";
  }

  function retrieve_keys_matching_subkey($arr, $subkey, $value)
  {
     $out=array();
     foreach ($arr as $key=>$sub) {
         if ($sub[$subkey]===$value) {
             $out=$key;
         }
     }
     return $out;
  }
如果您维护索引,这显然会更有效率。此代码并不简单。 如果您正在使用大型数据集,那么我强烈建议您使用DBMS来管理数据。如果不切实际,请使用链表。     
        只能通过多维数组来实现     

要回复问题请先登录注册