array_diff not always correct - php

I show my example of diff between values in arrays, sometimes doesn't work corectly.
$fields = array(
'1x1' => 'k',
'1x2' => 'B',
'1x3' => 'c',
'2x1' => 'd',
'2x2' => 'x',
'2x3' => 'Y',
'3x1' => 'b',
'3x2' => 'e',
'3x3' => 'f'
);
print_r($fields);
$answer = array(
'a',
'b',
'c',
'd',
'x',
'y',
'z',
'e',
'f'
);
print_r($answer);
echo '<hr />DIFF:<br />';
print_r(array_diff($fields, $answer));
?>
Results is:
(
[1x1] => k
[1x2] => B
[2x3] => Y
)
But should be:
(
[1x1] => k
[1x2] => B
[2x3] => Y
[3x1] => b
)
Why for PHP b is equal with z?
How to repair this?

This is working correct. According to array_diff() documentation:
array array_diff ( array $array1 , array $array2 [, array $... ] )
Compares array1 against one or more other arrays and returns the
values in array1 that are not present in any of the other arrays.
Another important info from documentation:
Two elements are considered equal if and only if (string) $elem1 ===
(string) $elem2. In words: when the string representation is the same.
So in $answers array there are no k, B, Y elements of $fields array.

The method isn't wrong, compare the 2 lists, they both contain b

see you put 'b' into both the $answer and the $fields array .
so that's why it gives u such output .

Related

Echo the keys of a array on a single line ? PHP

How to get an echo of the keys of a array, on a single line ?
[The] => s
[revelation] => b
[that] => z
[the] => d
[Star] => e
[Wars] => h
Result :
<p>The revelation that the Star Wars.</p>
It's pretty simple:
$myArray = [
'The' => 's',
'revelation' => 'b',
'that' => 'z',
'the' => 'd',
'Star' => 'e',
'Wars' => 'h',
];
echo implode(' ', array_keys($myArray));
This basically gets an array of the keys, then implodes them with spaces.

How to transform a string that contains a nested array into an actual array?

I am trying to find a way to transform a string type variable into an array type variable. To be more precise, what i am looking for is the change this (example):
$v = "['1', 'a', ['2', 'b', ['3'], 'c']]";
note that this is not a json-formatted string.
into this:
$v = ['1', 'a', ['2', 'b', ['3'], 'c']];
Note the double-quotes in the first example, $v is a string, not an array, which is the desired effect.
Simple solution using str_replace(to prepare for decoding) and json_decode functions:
$v = "['1', 'a', ['2', 'b', ['3'], 'c']]";
$converted = json_decode(str_replace("'",'"',$v));
print_r($converted);
The output:
Array
(
[0] => 1
[1] => a
[2] => Array
(
[0] => 2
[1] => b
[2] => Array
(
[0] => 3
)
[3] => c
)
)
$v = "['1', 'a', ['2', 'b', ['3'], 'c']]";
eval("\$v = $v;");
var_dump($v);
PS: make sure $v string doesn't contain unexpected code.
This should work:
$json = "['1', 'a', ['2', 'b', ['3'], 'c']]";
$json = str_replace("'",'"',$json);
$result_array = json_decode($json); // This is your array

set reduction recursive algorithm

Given (A,B,C,D)
What is an algorithm that can reduce it to unique non duplicated sets of size n.
For example if n is 3.
[A,B,C]
[A,C,D]
[A,B,D]
[B,C,D]
As you'll notice A,A,A cannot be valid neither can A,A,B and [A,C,D] = [C,A,D] = [A,C,D] = [D,C,A] = etc..
is there a way to not generate the powerset and reduce it because a powerset of 7 elements is n^7, which quickly gets exhaustive.
Take a look at Math_Combinatorics.
<?php
require 'Combinatorics.php';
$combinatorics = new Math_Combinatorics;
$result = $combinatorics->combinations( ['A','B','C','D'], 3 );
var_export($result);
prints
array (
0 =>
array (
0 => 'A',
1 => 'B',
2 => 'C',
),
1 =>
array (
0 => 'A',
1 => 'B',
3 => 'D',
),
2 =>
array (
0 => 'A',
2 => 'C',
3 => 'D',
),
3 =>
array (
1 => 'B',
2 => 'C',
3 => 'D',
),
)
It also has a permutations method (i.e. [A,B,C]!=[A,C,B] and therefore both are in the result set)

PHP Assign Array Keys with New Array with Existing Arrays

To save on typing out the key name for every single array, I want to be able to build lists like..
$lists = array (
0 => array ('A', 'B', 'C', 'D', 'E');
1 => array ('A', 'B', 'C', 'D', 'E');
2 => array ('A', 'B', 'C', 'D', 'E');
)
.. and then assign the same key names to all them (either before or after)..
Key1, Key2, Key3, Key4, Key5
.. so when they're called, I can do something like..
foreach($lists as $list) {
showList($list);
}
.. and then within the showList() function, I can call the 5 keys by the key name.
The function I have set no problem, but it's assigning the key names that I'm not sure how to do. Sorry if my terminology isn't accurate, but hopefully I explained it well enough.
array_combine will make an associative array from an array of keys and an array of values.
$keys = array('Key1', 'Key2', 'Key3', 'Key4', 'Key5');
foreach ($lists as $list) {
showList(array_combine($keys, $list));
}
If you want to modify $lists permanently, you can do:
foreach ($lists as &$list) {
$list = array_combine($keys, $list);
}
The reference variable &$list makes this replace the elements in place.
Try this :
<?php
$keys = array('Key1', 'Key2', 'Key3', 'Key4', 'Key5');
$lists = array (
array ('A', 'B', 'C', 'D', 'E'),
array ('A', 'B', 'C', 'D', 'E'),
array ('A', 'B', 'C', 'D', 'E')
);
function showList($list){
global $keys;
return array_combine($keys, $list);
}
$output = array_map("showList", $lists);
echo "<pre>";
print_r($output);
?>
Result:
Array
(
[0] => Array
(
[Key1] => A
[Key2] => B
[Key3] => C
[Key4] => D
[Key5] => E
)
[1] => Array
(
[Key1] => A
[Key2] => B
[Key3] => C
[Key4] => D
[Key5] => E
)
[2] => Array
(
[Key1] => A
[Key2] => B
[Key3] => C
[Key4] => D
[Key5] => E
)
)

PHP finding the first matching value in 2 arrays

I have two arrays and want to find the first match for either of arrayTwos values in arrayOne.
arrayOne ( [0] = C [1] = A [2] = B [3] = D [4] = B [5] = C)
and
arrayTwo ( [0] = A [1] = B [2] = C )
With these values I would want to return the value "C" as it is the first value in arrayTwo to appear in arrayOne.
I'm thinking I could use for loops and if statements to run through but re there any functions in PHP I could use to simplify this?
Use array_search
$keys = array_search($second_array, $first_array);
Ref : http://in3.php.net/array_search
array_search
$valuekeys = array_search($secondarray, $arrayone);
use array_intersect
$arrayOne = array('C', 'A', 'B', 'D', 'B', 'C');
$arrayTwo = array('A', 'C');
$result = array_intersect($arrayOne , $arrayTwo);
echo $result[0];
Use array_intersect. This will do the job. http://www.php.net/manual/en/function.array-intersect.php Note the difference between using array_intersect($array1, $array2) and array_intersect($array2, $array1)
You can use array_intersect():
$arr1 = array( 0 => 'C', 1 => 'A', 2 => 'B', 3 => 'D', 4 => 'B', 5 => 'C');
$arr2 = array( 0 => 'A', 1 => 'B', '2' => 'C' );
$arr3 = array_intersect($arr1,$arr2);
var_dump($arr3[0]);
string(1) "C"

Categories